해당 백업 파일은 SQL Server 2000에서 생성하여 백업한 파일로 [test]라는 유저가 [test].[tbl_TEST]라는 테이블을 만들고 백업을 한 파일입니다. 즉, 위 파일을 2005에서 그대로 그냥 복원을 하면 아래와 같은 데이터베이스 트리구조를 보게 되실겁니다.
1.
–======================================================
2.
— test 로그인 유저 생성하기
3.
–======================================================
4.
CREATE
LOGIN test
WITH
PASSWORD
=
‘1111’
1.
–======================================================
2.
— test 유저 추가하기
3.
–======================================================
4.
USE [TESTDB]
5.
GO
6.
CREATE
USER
[test]
FOR
LOGIN [test]
7.
GO
메시지 15023, 수준 16, 상태 1, 줄 1
현재 데이터베이스에 사용자, 그룹 또는 역할 ‘test’이(가) 이미 있습니다.
우린 추가해준 기억이 없는데 이미 있다네요. 왜 있을까요 ??
그렇죠 앞에서 우리는 복원을 했기 때문에 기존 사용자가 그대로 복원이 된 것입니다. 그럼 어떻게 할까요?? 저 사용자를 지울까요?? 한번 지워볼까요??
1.
–======================================================
2.
— test 유저 해제하기
3.
–======================================================
4.
USE [TESTDB]
5.
GO
6.
DROP
USER
[test]
7.
GO
하지만, 우리의 MSSQL님께서는 다음과 같은 에러 메시지를 출력해주십니다.
메시지 15138, 수준 16, 상태 1, 줄 1
데이터베이스 보안 주체는 데이터베이스의 스키마을(를) 소유하며 삭제할 수 없습니다.
갈수록 태산입니다. 그럼 SCHEMA를 삭제 해볼까요??
1.
–======================================================
2.
— test schema 스키마 삭제하기
3.
–======================================================
4.
USE [TESTDB]
5.
GO
6.
DROP
SCHEMA
test
7.
GO
메시지 3729, 수준 16, 상태 1, 줄 1
‘test’은(는) 개체 ‘tbl_TEST’에서 참조하고 있으므로 drop schema할 수 없습니다.
아 깝깝합니다. 그럼 테이블을 지울까요?? 그 테이블에 중요한 내용이 있다면?? 그럼 다른 테이블을 만들어서 해당 내용을 이동했다가 지우고 다시 동일한 이름의 테이블을 만들고 데이터를 이동 시킬까요?? 아.. 왠지 삽질 하는것 같고 없어보이고 작업도 짜증날것 같습니다.
그래서 이런 경우에 사용하라고 MSSQL 2000에서는 sp_change_users_login 즉, 유저를 매핑하는 명령어 입니다. 이후 MSSQL 2005에서는 같은 기능을 한 다른 명령어를 제공했습니다. ALTER USER 입니다.
01.
–======================================================
02.
— 유저 매핑하기
03.
–======================================================
04.
USE [TESTDB]
05.
GO
06.
EXEC
sp_change_users_login
‘update_one’
,
‘test’
,
‘test’
;
07.
GO
08.
09.
USE [TESTDB]
10.
GO
11.
ALTER
USER
test
WITH
LOGIN = test
12.
GO
01.
–======================================================
02.
— 스키마 변경하기
03.
— 해당 스키마 www.sqlworld.pe.kr의 이장래 선생님
04.
— 께서 작성하신 쿼리입니다.
05.
–======================================================
06.
USE [TESTDB]
07.
GO
08.
SELECT
‘ALTER SCHEMA dbo TRANSFER test.’
+
name
FROM
sys.tables
09.
WHERE
schema_id = SCHEMA_ID(
‘test’
)
10.
GO
해당 포스트에서 사용자가 무엇이며, 스키마가 무엇이고 스키마 정의는 어떻게 하고 스키마를 이용하여 권한이행을 어떻게 하면 등등의 스키마에 대한 자세한 설명을 다루지 않았습니다. 이 부분은 책이나 인터넷을 통하여 쉽게 접근할 수 있는 내용이라고 생각하여 정리를 하지 않았습니다. 하지만, 위와 같은 문제는 빈번하게 발생하며 또한, 꾸준히 질문이 올라오고 있습니다. 해당 포스트를 읽고 문제 해결에 조금이나마 도움이 되었으면 하는 바램에 적어보았습니다.
출저 : http://gdbt.tistory.com/58