Search

2015년 10월 27일 화요일

[Database] [MSSQL] 현재 데이터베이스 내 모든 테이블의 소유자 변경 쿼리 생성방법.

* 현재 사용중인 데이터베이스의 모든 테이블에 대해 혹은 일정 조건을 만족하는 테이블에 대해 소유자를 변경하려면 어떻게 해야할까?
* 과거의 소유자가 dbooo인 테이블들을 찾아 모두 dbo로 변경하려면 다음의 쿼리를 실행해 나온 결과값을 복사해 다시 실행해주면 된다.

DECLARE @old_table_owner sysname, @new_table_owner sysname

SELECT
 @old_table_owner = 'dbooo',
 @new_table_owner = 'dbo'

select 'EXECUTE sp_changeobjectowner '''+QUOTENAME(a.TABLE_SCHEMA)+'.'+QUOTENAME(a.TABLE_NAME)+''','''+@new_table_owner+''''
from INFORMATION_SCHEMA.TABLES a
where a.TABLE_SCHEMA = @old_table_owner
    AND OBJECTPROPERTY(OBJECT_ID(QUOTENAME(a.TABLE_SCHEMA)+'.'+QUOTENAME(a.TABLE_NAME)), 'IsMSShipped') = 0

* 만약 테이블이 아닌 뷰, 프로시져 등을 변경하고 싶으면, INFORMATION_SCHEMA 뒤의 TABLE을 VIEW, ROUTINES 등으로 변경해주면 된다.

---------------------------------------------------------------------------------------------

* 아래와 같이 바로 변경하는 쿼리도 있지만, 데이터베이스 내 모든 테이블의 소유자를 한번에 변경하는 쿼리는 위험하니 정확하게 판단 후에 실행하자.

DECLARE @old_table_owne sysname, @new sysname, @sql varchar(1000)

SELECT
    @old_table_owne = 'dbooo',
    @new_table_owner = 'dbo',
    @sql = '
  IF EXISTS (SELECT NULL FROM INFORMATION_SCHEMA.TABLES
  WHERE
      QUOTENAME(TABLE_SCHEMA)+''.''+QUOTENAME(TABLE_NAME) = ''?''
      AND TABLE_SCHEMA = ''' + @old_table_owne + '''
  )
  EXECUTE sp_changeobjectowner ''?'', ''' + @new_table_owner + ''''

EXECUTE sp_MSforeachtable @sql


댓글 없음:

댓글 쓰기