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 |