ms-sql 소유자명 한꺼번에 변경하기 (sp_changeobjectowner) | Database

DB 이전을 하다보면  소유자명 때문에 골치 아플때가 있죠?

예를 들어 이런거죠..

 

select * from table 이렇게 쓰면 되는데..

이게 DB이전에서 소유자때문에..

select * from user.table 이렇게 바꿔서 써야하는,....덜덜

 

아 피곤합니다 이걸 일일이 소스에서 다 바꿀수도 없고..

그렇다고 DB에서 소유자 명을 바꾸자니..한두개도 아니고..

 

우선 하나씩 바꾸는법..이건 간단합니다.

sp_changeobjectowner 'user1.tablename','user2'

이렇게 쓰면 되는데 앞에 user1 이 원래 소유자명 뒤 user2가 바꿀 소유자명입니다.

근데 이러면 문제가 하나씩 바꿔줘야 한다는거죠 이러면 오래 걸리죠..

 

그래서 한번에 바꾸는걸 찾다가 발견!!

CREATE PROCEDURE [dbo].[usp_ChangeAllObjOwner]
(
    @oldowner sysname, --원래 소유자
    @newowner sysname, --바꿀 소유자
    @type sysname --타입 U:테이블 P:프로시져 V:뷰
)
AS

DECLARE @objname sysname
SET NOCOUNT ON

IF USER_ID(@oldowner) IS NULL
BEGIN
    RAISERROR ('@oldowner 소유자는 데이터베이스에 존재하지 않습니다.', 16, 1)
    RETURN
END

IF USER_ID(@newowner) IS NULL
BEGIN
    RAISERROR ('@newowner소유자는 데이터베이스에 존재하지 않습니다.', 16, 1)
    RETURN
END

DECLARE cur_ChangeAllObjOwner CURSOR FOR 
SELECT name FROM sysobjects WHERE uid = USER_ID(@oldowner) and xtype=@type

OPEN cur_ChangeAllObjOwner

FETCH NEXT FROM cur_ChangeAllObjOwner INTO @objname
WHILE (@@fetch_status = 0)
BEGIN
    SET @objname = @oldowner + '.' + @objname
    EXEC sp_changeobjectowner @objname, @newowner
    FETCH NEXT FROM cur_ChangeAllObjOwner INTO @objname
END

CLOSE cur_ChangeAllObjOwner
DEALLOCATE cur_ChangeAllObjOwner

 

우선 이 프로시져를 생성하고 실행하면 됩니다.

 

실행 방법은?

 

EXEC usp_ChangeAllObjOwner 'orname','newname','U'

 

이렇게 첫번째 원래 소유자,두번째 바꿀소유자,세번째 타입 이렇게 쓰면 됩니다.

끝~~~

 

출처 : http://cafe.naver.com/ilovedata.cafe?iframe_url=/ArticleRead.nhn?articleid=284&

 

ms-sql,schema
Comment Write
Comment List
등록된 코멘트가 없습니다.