반응형

오브젝트의 소유자 변경하기

 

SQL Server 2000 이전 버전에서는 오브젝트의 소유자를 변경하기 위해서 sp_changeobjectowner 시스템 저장 프로시저를 사용한다. 하지만, SQL Server 2005에 이르러서는 sp_changeobjectowner 시스템 저장 프로시저를 대신하여 ALTER AUTHORIZATION... 구문을 통해 오브젝트의 소유자를 변경할 수 있게 되었다.

 

 

1. SQL Server 2000 이전 버전에서

 

구문

sp_changeobjectowner [ @objname = ] 'object' , [ @newowner = ] 'owner'

  

인수

인수

데이터

형식

설명

[ @objname = ] 'object'

VARCHAR(776)

현재 데이터베이스의 기존 오브젝트 명이다.

오브젝트에서 테이블, 뷰, 사용자 정의 함수 또는 저장 프로시저가 될 수 있다.

기본값은 없다.

스키마와 스키마 소유자가 동일한 이름을 갖고 있는 경우 objectexisting_owner.object 의 형태로 기존 개체의 소유자를 명시해야 한다.

[ @newowner=] 'owner '

SYSNAME

개체의 새 소유자가 될 보안 계정의 이름이다.

기본값은 없다.

owner는 유효한 데이터베이스 사용자, 서버 역할, Microsoft Windows 로그인 또는 현재 데이터베이스에 액세스할 수 있는 Windows 그룹이어야 한다.

새 소유자가 해당하는 데이터베이스 수준의 보안 주체가 없는 Windows 사용자 또는 Windows 그룹이면 데이터베이스 사용자가 생성된다.

 

실행 예

다음 예는 author 테이블의 소유자 를 testuser1에서 testuser2로 변경한다.

USE PUBS

GO

 

EXEC sp_changeobjectowner 'testuser1.author','testuser2'

GO

 

 

2. SQL Server 2005 이후 버전에서

 

구문

ALTER AUTHORIZATION
   ON [ <entity_type> :: ] entity_name
   TO { SCHEMA OWNER | principal_name }

<entity_type> ::=
    {
        Object | Type | XML Schema Collection
        | Fulltext Catalog | Fulltext Stoplist | Schema
    | Assembly | Role | Message Type | Contract | Service
    | Remote Service Binding | Route | Symmetric Key | Endpoint
    | Certificate | Database
    }

  

인수

인수 설명

 <entity_type> ::

소유자가 변경될 엔터티의 클래스

Object가 기본값이다.

 entity_name

엔터티의 이름

 principal_name

엔터티를 소유하게 될 보안 주체의 이름

 

주의사항

  • 데이터베이스 수준 엔터티의 소유권은 데이터베이스 수준의 모든 보안 주체에게 이전할 수 있다.
  • 서버 수준 엔터티의 소유권은 서버 수준 보안 주체에게만 이전할 수 있다.
  • SQL Server 2005부터 사용자는 다른 데이터베이스 사용자가 소유한 스키마에 포함된 OBJECT 또는 TYPE을 소유할 수 있다.
  • SCHEMA OWNER 옵션은 스키마 수준 엔터티의 소유권을 이전하는 경우에만 유효하다.
  • SCHEMA OWNER는 엔터티의 소유권을 엔터티가 속한 스키마의 소유자에게 이전한다.
  • 스키마 수준 엔터티는 OBJECT, TYPE 또는 XML SCHEMA COLLECTION 클래스뿐이다.
  •  

    이전 가능한 엔티티

  • "object" 형식의 스키마 수준 엔터티인 테이블, 뷰, 함수, 프로시저, 큐 및 동의어 엔터티
  •  

    이전 불가능한 엔티티

  • 연결된 서버, 통계, 제약 조건, 규칙, 기본값, 트리거, Service Broker 큐, 자격 증명,
  • 파티션 함수, 파티션 구성표, 데이터베이스 마스터 키, 서비스 마스터 키 및 이벤트 알림 엔터티
  • 서버, 로그인, 사용자, 응용 프로그램 역할 및 열 보안 개체 클래스의 멤버 소유권
  •  

    실행 예 1: 테이블의 소유권 이전

    다음 예는 Person 스키마의 TestTable 테이블의 소유권을  testuser2 사용자에게 이전한다.

     

    이에 앞서 현재 Person.TestTable 테이블의 소유권이 누구에게 있는지 확인해 보자

    SELECT
           t2.[name] AS UserName
         , SCHEMA_NAME(t1.schema_id) AS SchemaName
         , t1.[name] AS ObjectName
      FROM sys.objects AS t1
      INNER JOIN sys.database_principals AS t2
        ON t1.principal_id = t2.principal_id
     WHERE [object_id] = object_id('Person.TestTable')
    GO

     

    Result >>

    UserName   SchemaName  ObjectName
    ------------ ---------------- ---------------
    testuser1    Person            TestTable

    조회를 통해 Person.TestTable 테이블의 소유권은 testuser1에 있음을 확인할 수 있다.

     

    이제 이 소유권을 testuser1 사용자에서 testuser2 사용자에게 이전하도록 하자.

    ALTER AUTHORIZATION ON OBJECT::Person.TestTable TO testuser2;
    GO

    또는

    ALTER AUTHORIZATION ON Person.TestTable TO testuser2;
    GO

     

    이제 제대로 소유권이 변경되었는지 확인해 보도록 하자.

    SELECT
           t2.[name] AS UserName
         , SCHEMA_NAME(t1.schema_id) AS SchemaName
         , t1.[name] AS ObjectName
      FROM sys.objects AS t1
      INNER JOIN sys.database_principals AS t2
        ON t1.principal_id = t2.principal_id
     WHERE t1.[object_id] = object_id('Person.TestTable')
    GO

     

    Result >>

    UserName   SchemaName  ObjectName
    ------------ ---------------- ---------------
    testuser2    Person            TestTable

    Person.TestTable 테이블의 소유권이 testuser1 사용자에서 testuser2 사용자로 이전되었음을 확인할 수 있다.

     

     

    실행 예 2: 스키마의 사용권을 다른 사용자에게 이전

    다음 예는 TestUser1Schema 스키마의 소유권을 testuser1 사용자에게 소유권을 이전한다.

     

    이에 앞서 현재 TestUser1Schema 스키마의 소유권이 누구에게 있는지 확인해 보도록 하자.

    SELECT t1.[name] AS SchemaName
         , t2.[name] AS UserName
      FROM sys.schemas AS t1
     INNER JOIN sys.database_principals AS t2
        ON t1.principal_id = t2.principal_id
     WHERE t1.[schema_id] = SCHEMA_ID('TestUser1Schema')
    GO
     

    Result >>

    SchemaName        UserName
    -------------------- ----------------
    TestUser1Schema   testuser2

    조회를 통해 TestUser1Schema 스키마의 소유권이 testuser2에 있음을 확인할 수 있다.

     

    이제 TestUser1Schema 스키마의 소유권을 testuser1 사용자에게 넘기도록 하겠다.

    ALTER AUTHORIZATION ON SCHEMA::TestUser1Schema TO testuser1;
    GO

     

    이제 제대로 소유권이 변경되었는지 확인해 보도록 하자.

    SELECT t1.[name] AS SchemaName
         , t2.[name] AS UserName
      FROM sys.schemas AS t1
     INNER JOIN sys.database_principals AS t2
        ON t1.principal_id = t2.principal_id
     WHERE t1.[schema_id] = SCHEMA_ID('TestUser1Schema')
    GO
     

    Result >>

    SchemaName        UserName
    -------------------- ----------------
    TestUser1Schema   testuser1

    TestUser1Schema 스키마의 소유권이 testuser2 사용자에서 testuser1 사용자로 이전되었음을 확인할 수 있다.

     

    기타 예는 ALTER AUTHORIZATION의 BOL을 참조하기 바란다.

    반응형

    + Recent posts