SQL Server 2005에서는 소유자가 스키마를 소유하고 스키마가 오브젝트를 소유합니다.
> 기호의 벌어진 쪽이 좁혀진 쪽을 소유한다는 의미로 사용했을 때, 다음과 같이 표현할 수 있습니다.
소유자 > 스키마 > 오브젝트
따라서 소유자를 삭제할 경우에는 삭제할 소유자가 소유한 스키마의 소유권을 새로운 소유자에게 이전한 후 기존 소유자를 삭제하면 됩니다.
다음의 쿼리를 한 줄씩 실행해보시면 소유자 확인 및 이전, 삭제의 방법을 알게 되시리라 생각합니다.
반드시 충분한 테스트를 해보시고 실전에 사용하시기 바랍니다. ^^;;;
- SQL Server 2005의 경우
| 00 | /*************************************************************/ | 
| 01 | -- 사용자와 관련 오브젝트 목록 확인 및 사용자 삭제 - SQL Server 2005 | 
| 02 | /*************************************************************/ | 
| 03 | USE master; | 
| 04 | GO | 
| 05 |   | 
| 06 | /*************************************************************/ | 
| 07 | /**-- 테스트를 위한 사용자, 스키마, 테이블 생성--------------------------*/ | 
| 08 |   | 
| 09 | -- 테스트 데이터 베이스 생성 | 
| 10 | CREATE DATABASE AccTestDB; | 
| 11 |   | 
| 12 | -- 로그인 생성 | 
| 13 | CREATE LOGIN AccountTestA WITH PASSWORD = 'test1'; | 
| 14 | CREATE LOGIN AccountTestB WITH PASSWORD = 'test2'; | 
| 15 | GO | 
| 16 |   | 
| 17 | -- 사용자 생성 | 
| 18 | USE AccTestDB; | 
| 19 | GO | 
| 20 | CREATE USER AccountTestA FOR LOGIN AccountTestA WITH DEFAULT_SCHEMA = AccSchema; | 
| 21 | CREATE USER AccountTestB FOR LOGIN AccountTestB WITH DEFAULT_SCHEMA = AccSchema; | 
| 22 | GO | 
| 23 |   | 
| 24 | -- 테이블 생성 권한을 위한 역할 추가 | 
| 25 | EXEC sp_addrolemember 'db_owner', 'AccountTestA'; | 
| 26 | EXEC sp_addrolemember 'db_owner', 'AccountTestB'; | 
| 27 | GO | 
| 28 |   | 
| 29 | -- 스키마 생성 | 
| 30 | CREATE SCHEMA AccSchema AUTHORIZATION AccountTestA; | 
| 31 |   | 
| 32 | -- 사용자 생성 확인 | 
| 33 | SELECT * FROM sys.sysusers; | 
| 34 | SELECT * FROM sys.schemas; | 
| 35 |   | 
| 36 | -- SQL Server 2005에서는 소유자.테이블이 아닌 스키마.테이블로 테이블을 생성 | 
| 37 | EXECUTE AS LOGIN = 'AccountTestA'; | 
| 38 | GO | 
| 39 | CREATE TABLE AccSchema.AccTable (Col1 int); | 
| 40 | GO | 
| 41 |   | 
| 42 | /*************************************************************/ | 
| 43 | /**-- AccountTestA가 소유자인 오브젝트 목록 조회-------------------------*/ | 
| 44 | SELECT u.name as UserName, s.name as SchemaName, o.Type as ObjectType, o.name as ObjectName | 
| 45 | FROM sys.sysusers u  | 
| 46 | JOIN sys.schemas s ON u.uid = s.principal_id | 
| 47 | JOIN sys.objects o ON s.schema_id=o.schema_id  | 
| 48 | WHERE u.name = 'AccountTestA' | 
| 49 |   | 
| 50 | /*************************************************************/ | 
| 51 | /**-- SQL Server 2005에서는 소유자가 스키마를 소유하고 | 
| 52 | 스키마가 오브젝트를 소유하기 때문에 | 
| 53 |         소유자를 삭제할 경우에는 오브젝트를 삭제하지 않고 | 
| 54 | 삭제할 소유자가 소유한 스키마의 소유권을 이전한 후,  | 
| 55 | 소유자를 삭제한다. --*/ | 
| 56 |   | 
| 57 | -- 소유자삭제 | 
| 58 | DROP USER AccountTestA | 
| 59 | /* | 
| 60 | 메시지15138, 수준16, 상태1, 줄1 | 
| 61 | 데이터베이스 보안 주체는 데이터베이스의 스키마을(를) 소유하며 삭제할 수 없습니다. | 
| 62 | */ | 
| 63 |   | 
| 64 | -- AccountTestA 소유자인 테이블 목록 조회 | 
| 65 | SELECT u.name as UserName, s.name as SchemaName | 
| 66 | FROM sys.sysusers u JOIN sys.schemas s ON u.uid = s.principal_id | 
| 67 | WHERE u.name = 'AccountTestA' | 
| 68 |   | 
| 69 | -- 소유권 이전 | 
| 70 | ALTER AUTHORIZATION ON SCHEMA::AccSchema TO AccountTestB; | 
| 71 | GO | 
| 72 |   | 
| 73 | -- 삭제하려는 소유자를 가진 테이블 삭제 후, 사용자 삭제 | 
| 74 | DROP USER AccountTestA; | 
| 75 | GO | 
| 76 | SELECT * FROM sys.sysusers WHERE name = 'AccountTestA'; | 
| 77 | GO | 
| 78 | /* | 
| 79 | 메시지916, 수준14, 상태1, 줄1 | 
| 80 | 현재 보안 컨텍스트로는 서버 보안 주체 "AccountTestA"이(가) 데이터베이스 "AccTestDB"에 액세스 할 수 없습니다. | 
| 81 |   | 
| 82 | */ | 
| 83 |   | 
| 84 | /*************************************************************/ | 
| 85 | -- 데이터베이스 삭제 | 
| 86 | REVERT; | 
| 87 |   | 
| 88 | USE master; | 
| 89 | DROP DATABASE AccTestDB; | 
| 90 |   | 
| 91 | -- 로그인 삭제 | 
| 92 | DROP LOGIN AccountTestA; | 
| 93 | DROP LOGIN AccountTestB; | 
- SQL Server 2000의 경우
| 00 | /*************************************************************/ | 
| 01 | -- 사용자와 관련 오브젝트 목록 확인- SQL Server 2000 | 
| 02 | /*************************************************************/ | 
| 03 | USE master; | 
| 04 | GO | 
| 05 |   | 
| 06 | /*************************************************************/ | 
| 07 | /**-- 테스트를 위한 사용자 및 테이블 생성----------------------------------------------*/ | 
| 08 |   | 
| 09 | -- 테스트 데이터베이스 생성 | 
| 10 | CREATE DATABASE AccTestDB | 
| 11 | GO | 
| 12 |   | 
| 13 | -- 로그인 생성 | 
| 14 | EXEC sp_addlogin 'AccountTest', 'test', 'AccTestDB' | 
| 15 |   | 
| 16 | -- 사용자 생성 | 
| 17 | USE AccTestDB | 
| 18 | GO | 
| 19 | EXEC sp_adduser 'AccountTest' | 
| 20 | GO | 
| 21 |   | 
| 22 | -- 테이블 생성 권한을 위한 역할 추가 | 
| 23 | EXEC sp_addrolemember 'db_owner', 'AccountTest' | 
| 24 |   | 
| 25 | -- 사용자 생성 확인 | 
| 26 | SELECT * FROM sysusers WHERE name = 'AccountTest' | 
| 27 |   | 
| 28 | -- 실행 사용자를 AccountTest로 변경 | 
| 29 | SETUSER 'AccountTest' | 
| 30 |   | 
| 31 | -- 관련 테이블 생성 | 
| 32 | CREATE TABLE AccTable (Col1 int) | 
| 33 |   | 
| 34 |   | 
| 35 | /*************************************************************/ | 
| 36 | /**-- AccountTest가 소유자인 오브젝트 목록 조회-------------------------------------*/ | 
| 37 | SELECT o.xType as ObjectType, u.name as UserName, o.name as ObjectName  | 
| 38 | FROM sysusers u JOIN sysobjects o ON u.uid=o.uid  | 
| 39 | WHERE u.name = 'AccountTest' | 
| 40 |   | 
| 41 |   | 
| 42 | /*************************************************************/ | 
| 43 | /**-- 소유자 삭제 테스트-------------------------------------------------------------------*/ | 
| 44 | -- 소유자 삭제 | 
| 45 | EXEC sp_dropuser 'AccountTest' | 
| 46 | /* | 
| 47 | 서버: 메시지15183, 수준16, 상태1, 프로시저sp_MScheck_uid_owns_anything, 줄17 | 
| 48 | 데이터베이스의 개체를 소유하고 있으므로 사용자를 삭제할 수 없습니다. | 
| 49 | */ | 
| 50 |   | 
| 51 | -- AccountTest가 소유자인 테이블 목록 조회 | 
| 52 | SELECT u.name, o.name FROM sysusers u JOIN sysobjects o ON u.uid=o.uid  | 
| 53 | WHERE u.name = 'AccountTest' and o.xType='U' | 
| 54 |   | 
| 55 | -- 새 로그인 생성 | 
| 56 | SETUSER | 
| 57 | EXEC sp_addlogin 'AccountTest2'; | 
| 58 |   | 
| 59 | -- 새 사용자 생성 | 
| 60 | EXEC sp_adduser 'AccountTest2'; | 
| 61 |   | 
| 62 | -- 소유자 이전 | 
| 63 | EXEC sp_changeobjectowner 'AccountTest.AccTable' , 'AccountTest2'; | 
| 64 | /* | 
| 65 | 주의: 개체 이름부분을 변경하면 스크립트나 저장프로시저를 손상시킬 수 있습니다. | 
| 66 | */ | 
| 67 |   | 
| 68 | -- 소유자 삭제 재시도 | 
| 69 | EXEC sp_dropuser 'AccountTest' | 
| 70 |   | 
| 71 | -- 로그인 삭제 | 
| 72 | EXEC sp_droplogin 'AccountTest' | 
| 73 |   | 
| 74 | -- 확인 | 
| 75 | SELECT * FROM master.dbo.SYSXLOGINS | 
| 76 | SELECT * FROM SYSUSERS | 
| 77 |   | 
| 78 | /**--테스트 완료------------------------------------------------------------------------*/ | 
| 79 | -- 데이터베이스 삭제 | 
| 80 | USE master | 
| 81 | DROP DATABASE AccTestDB | 
| 82 |   | 
| 83 | -- 로그인 삭제 | 
| 84 | EXEC sp_droplogin 'AccountTest2' | 
| 85 |   | 
| 86 | -- 확인 | 
| 87 | SELECT * FROM master.dbo.SYSXLOGINS | 
| 88 | SELECT * FROM SYSUSERS 
 | 
[출처] [MS SQL] 사용자 계정과 관련된 오브젝트 확인 및 삭제 (서버관리 마스터 - OS, WAS, DB, Network)
'Database > SQL-Server' 카테고리의 다른 글
| MS_SQL SERVER 2000 로그인 생성, 역할 지정 (0) | 2011.06.29 | 
|---|---|
| DBCC 명령어 (0) | 2011.06.29 | 
| DBCC CHECKDB, CHECKTABLE (손상된 테이블 복구) (0) | 2011.06.27 | 
| [MSSQL] 날짜 연산 DATEADD (0) | 2011.05.13 | 
| MSSQL dateadd() 이용하여 말일, 초일 구해보자 (0) | 2011.05.13 |