달력

4

« 2024/4 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
2009. 6. 9. 02:37

소유자 관련 Work/SQL Server2009. 6. 9. 02:37

간혹 발생하는 소유관련 문제...
관련 정보 중 가장 도움이 되었던 예제이다.

http://www.sqlleader.com/mboard.asp?exec=view&strBoardID=SS2005QNA&intSeq=2368

테이블 소유자 확인 및 변경
 
- SQL Server 2005의 경우
 
SQL Server 2005에서는 소유자가 스키마를 소유하고 스키마가 오브젝트를 소유합니다.
> 기호의 벌어진 쪽이 좁혀진 쪽을 소유한다는 의미로 사용했을 때, 다음과 같이 표현할 수 있습니다.
소유자 > 스키마 > 오브젝트
 
따라서 소유자를 삭제할 경우에는 삭제할 소유자가 소유한 스키마의 소유권을 새로운 소유자에게 이전한 후 기존 소유자를 삭제하면 됩니다.
다음의 쿼리를 한 줄씩 실행해보시면 소유자 확인 및 이전, 삭제의 방법을 알게 되시리라 생각합니다.
반드시 충분한 테스트를 해보시고 실전에 사용하시기 바랍니다. ^^;;;
 
/*************************************************************/
-- 사용자와 관련 오브젝트 목록 확인 및 사용자 삭제 - SQL Server 2005
/*************************************************************/
USE master;
GO
 
/*************************************************************/
/**-- 테스트를 위한 사용자, 스키마, 테이블 생성----------------*/
 
-- 테스트 데이터 베이스 생성
CREATE DATABASE AccTestDB;
 
-- 로그인 생성
CREATE LOGIN AccountTestA WITH PASSWORD = 'test1';
CREATE LOGIN AccountTestB WITH PASSWORD = 'test2';
GO
 
-- 사용자 생성
USE AccTestDB;
GO
CREATE USER AccountTestA FOR LOGIN AccountTestA WITH DEFAULT_SCHEMA = AccSchema;
CREATE USER AccountTestB FOR LOGIN AccountTestB WITH DEFAULT_SCHEMA = AccSchema;
GO
 
-- 테이블 생성 권한을 위한 역할 추가
EXEC sp_addrolemember 'db_owner', 'AccountTestA';
EXEC sp_addrolemember 'db_owner', 'AccountTestB';
GO
 
-- 스키마 생성
CREATE SCHEMA AccSchema AUTHORIZATION AccountTestA;
 
-- 사용자 생성 확인
SELECT * FROM sys.sysusers;
SELECT * FROM sys.schemas;
 
-- SQL Server 2005에서는 소유자.테이블이 아닌 스키마.테이블로 테이블을 생성
EXECUTE AS LOGIN = 'AccountTestA';
GO
CREATE TABLE AccSchema.AccTable (Col1 int);
GO
 
/*************************************************************/
/**-- AccountTestA가 소유자인 오브젝트 목록 조회-------------*/
SELECT u.name as UserName, s.name as SchemaName, o.Type as ObjectType, o.name as ObjectName
FROM sys.sysusers u
                           JOIN sys.schemas s ON u.uid = s.principal_id
                           JOIN sys.objects o ON s.schema_id=o.schema_id
WHERE u.name = 'AccountTestA'
 
/*************************************************************/
/**-- SQL Server 2005에서는 소유자가 스키마를 소유하고
                           스키마가 오브젝트를 소유하기 때문에
        소유자를 삭제할 경우에는 오브젝트를 삭제하지 않고
                           삭제할 소유자가 소유한 스키마의 소유권을 이전한 후,
                           소유자를 삭제한다. --*/
 
-- 소유자삭제
DROP USER AccountTestA
/*
메시지15138, 수준16, 상태1, 줄1
데이터베이스 보안 주체는 데이터베이스의 스키마을(를) 소유하며 삭제할 수 없습니다.
*/
 
-- AccountTestA 소유자인 테이블 목록 조회
SELECT u.name as UserName, s.name as SchemaName
FROM sys.sysusers u JOIN sys.schemas s ON u.uid = s.principal_id
WHERE u.name = 'AccountTestA'
 
-- 소유권 이전
ALTER AUTHORIZATION ON SCHEMA::AccSchema TO AccountTestB;
GO
 
-- 삭제하려는 소유자를 가진 테이블 삭제 후, 사용자 삭제
DROP USER AccountTestA;
GO
SELECT * FROM sys.sysusers WHERE name = 'AccountTestA';
GO
/*
메시지916, 수준14, 상태1, 줄1
현재 보안 컨텍스트로는 서버 보안 주체 "AccountTestA"이(가) 데이터베이스 "AccTestDB"에 액세스 할 수 없습니다.
 
*/
 
/*************************************************************/
-- 데이터베이스 삭제
REVERT;
 
USE master;
DROP DATABASE AccTestDB;
 
-- 로그인 삭제
DROP LOGIN AccountTestA;
DROP LOGIN AccountTestB;
 
 
 
- SQL Server 2000의 경우
 
/*************************************************************/
-- 사용자와 관련 오브젝트 목록 확인- SQL Server 2000
/*************************************************************/
USE master;
GO
 
/*************************************************************/
/**-- 테스트를 위한 사용자 및 테이블 생성----------------------*/
 
-- 테스트 데이터베이스 생성
CREATE DATABASE AccTestDB
GO
 
-- 로그인 생성
EXEC sp_addlogin 'AccountTest', 'test', 'AccTestDB'
 
-- 사용자 생성
USE AccTestDB
GO
EXEC sp_adduser 'AccountTest'
GO
 
-- 테이블 생성 권한을 위한 역할 추가
EXEC sp_addrolemember 'db_owner', 'AccountTest'
 
-- 사용자 생성 확인
SELECT * FROM sysusers WHERE name = 'AccountTest'
 
-- 실행 사용자를 AccountTest로 변경
SETUSER 'AccountTest'
 
-- 관련 테이블 생성
CREATE TABLE AccTable (Col1 int)
 
 
/*************************************************************/
/**-- AccountTest가 소유자인 오브젝트 목록 조회---------------*/
SELECT o.xType as ObjectType, u.name as UserName, o.name as ObjectName
FROM sysusers u JOIN sysobjects o ON u.uid=o.uid
WHERE u.name = 'AccountTest'
 
 
/*************************************************************/
/**-- 소유자 삭제 테스트-------------------------------------*/
-- 소유자 삭제
EXEC sp_dropuser 'AccountTest'
/*
서버: 메시지15183, 수준16, 상태1, 프로시저sp_MScheck_uid_owns_anything, 줄17
데이터베이스의 개체를 소유하고 있으므로 사용자를 삭제할 수 없습니다.
*/
 
-- AccountTest가 소유자인 테이블 목록 조회
SELECT u.name, o.name FROM sysusers u JOIN sysobjects o ON u.uid=o.uid
WHERE u.name = 'AccountTest' and o.xType='U'
 
-- 새 로그인 생성
SETUSER
EXEC sp_addlogin 'AccountTest2';
 
-- 새 사용자 생성
EXEC sp_adduser 'AccountTest2';
 
-- 소유자 이전
EXEC sp_changeobjectowner 'AccountTest.AccTable' , 'AccountTest2';
/*
주의: 개체 이름부분을 변경하면 스크립트나 저장프로시저를 손상시킬 수 있습니다.
*/
 
-- 소유자 삭제 재시도
EXEC sp_dropuser 'AccountTest'
 
-- 로그인 삭제
EXEC sp_droplogin 'AccountTest'
 
-- 확인
SELECT * FROM master.dbo.SYSXLOGINS
SELECT * FROM SYSUSERS
 
/**--테스트 완료------------------------------------------------------------------------*/
-- 데이터베이스 삭제
USE master
DROP DATABASE AccTestDB
 
-- 로그인 삭제
EXEC sp_droplogin 'AccountTest2'
 
-- 확인
SELECT * FROM master.dbo.SYSXLOGINS
SELECT * FROM SYSUSERS
:
Posted by Elick