까막군's 주접 블로그

검색 :
RSS 구독 : 글 / 댓글 / 트랙백 / 글+트랙백

[MSSQL] 2000 버전에서 2005 로 업그레이드 후 특정 테이블 조회/삭제가 되지 않는 경우

2010/06/08 15:36, 글쓴이 까막군
=============================================
작성자 : 최용수
작성일 : 2010-06-08
라이센스 : 암때나 퍼가시고 출처만 적어주세요..굽신굽신
=============================================

1. 상황

SQL Server 2000에서 운영중인 DB를 2005로 업그레이드 하는 도중에 management Studio에서 해당 DB의 Table 조회가 되지 않음 .
-> Context 값이 null이 있다고 솰롸솰롸...=ㅅ= 열받는다..


2. 원인 파악

무턱대고 업그레이드를 시작한것이 문제였지만.. 그전에 관리가 안된 DB를 유지한거 자체가 더문제..
일단 하단의 박스에 있는 쿼리를 실행하였다. (M-Studio에서 Table을 선택하면 실행되는쿼리다)



SELECT
'Server[@Name=' + quotename(CAST(serverproperty(N'Servername') AS sysname),'''') + ']' + '/Database[@Name=' + quotename(db_name(),'''') + ']' + '/Table[@Name=' + quotename(tbl.name,'''') + ' and @Schema=' + quotename(SCHEMA_NAME(tbl.schema_id),'''') + ']' AS [Urn],
tbl.name AS [Name],
SCHEMA_NAME(tbl.schema_id) AS [Schema],
CAST(
 case
    when tbl.is_ms_shipped = 1 then 1
    when (
        select
            major_id
        from
            sys.extended_properties
        where
            major_id = tbl.object_id and
            minor_id = 0 and
            class = 1 and
            name = N'microsoft_database_tools_support')
        is not null then 1
    else 0
end         
             AS bit) AS [IsSystemObject],
tbl.create_date AS [CreateDate]
FROM
sys.tables AS tbl
WHERE
(CAST(
 case
    when tbl.is_ms_shipped = 1 then 1
    when (
        select
            major_id
        from
            sys.extended_properties
        where
            major_id = tbl.object_id and
            minor_id = 0 and
            class = 1 and
            name = N'microsoft_database_tools_support')
        is not null then 1
    else 0
end         
             AS bit)=0)
ORDER BY
[Schema] ASC,[Name] ASC


결과는 역시나..ㅡ.ㅡ;

첫번째 컬럼 값인 urn 값이 null로 구성된 테이블 3개가 발견되었다. (이넘들은 Schema 컬럼값도 null이었다..)
그런데 이놈들은 삭제도 안되고 object_name으로 실행하는 모든 DML / DDL들에서 참조가 안되는 현상이 발생했다.
왜그란가~~

추가적인 조사.. sys.tables 를 뒤지기 시작..   principal_id 값이 .. 이상하다!!!
존재 하지 않는 principal_id 값을 가지고 있는 테이블들이었다..
-_- 분명 2000 서버에서 난감한 스키마 (dbo가 아닌..)를 마구 사용하다 스키마 날리고 뭐 그러면서
고스트(?) 테이블로 붕떠버린 현상으로 보인다.. (2000 과 2005의 스키마의 개념자체가 워낙에 천지차이라..)

복원 하면서 기존의 principal_id를 고대로 입력하고 있다가 2005에서 Schema Base의 Role에 떡하니 걸린것...으로 보여진다..

3. 해결

principal_id ....가 존재 하지 않아서 발생하는 것이므로..임의의 스키마를 생성하여 principal_id를 유효값으로 만들었다.
당연히 그다음은 object 삭제, 임의의 schema도 삭제.. [어짜피 참조도 뭐도 안되던 넘들이었다..]

m-studio에서도 잘나오고.. 찝찝한 기분도 사라졌다..

끝.











크리에이티브 커먼즈 라이센스
Creative Commons License
2010/06/08 15:36 2010/06/08 15:36

맨 위로

10년이 지난 후에..

2010/01/07 15:24, 글쓴이 까막군
인간으로서 30년..

개발자로서 10년..

남편으로서 5년..


10년이 지난후에도 변함없이 연차만 늘었으면 좋겠다..

개발자로서 10년... 지나온 기간보다 앞날이 더 짧게 느껴지기도 하는데..

글세.. 좀 늘려보고싶기도 하고..

이젠 내 일을 하고싶기도 하다.

적어도.. 뭔가 정리할 타이밍은 되었지.. 10년차..

크리에이티브 커먼즈 라이센스
Creative Commons License
2010/01/07 15:24 2010/01/07 15:24

맨 위로