temp 테이블이 아닌 tempdb가 아닌 사용자 데이터베이스에서 #으로 시작하는 SQL Server 테이블 이름


13

어떻게 든, 수십 년 전에,로 시작하는 테이블이 데이터베이스에 생성되었습니다 #. 앱 탐색기가 아닌 앱 데이터베이스 아래의 개체 탐색기에 표시됩니다 tempdb. 어떤 이유로 Azure는 이와 같은 데이터베이스를 가져 오지 않습니다.

삭제하거나 이름을 바꾸거나 상호 작용할 수 없습니다. 객체 탐색기에서 삭제 , 스크립트 드롭 , GUI에서 이름 바꾸기 를 시도했지만 그중 아무것도 작동하지 않았습니다.

우리는 SQL 2008 R2에 있습니다.

drop table [*app*].[dbo]."#OBSOLETE";

Database name '*app*' ignored, referencing object in tempdb.
Msg 3701, Level 11, State 5, Line 1
Cannot drop the table '#OBSOLETE', because it does not exist or you do not 
have permission.

exec sp_rename "dbo.#OBSOLETE", "dbo.obsolete"

Msg 15225, Level 11, State 1, Procedure sp_rename, Line 338
No item by the name of 'dbo.#OBSOLETE' could be found in the current database '*app*', given that @itemtype was input as '(null)'.

이 개체를 어떻게 종료하여 Azure로 마이그레이션 할 수 있습니까?


4
동일한 응답으로 테이블 이름을 대괄호로 묶어보십시오.
rvsc48

1
@ rvsc48의 솔루션이 그렇게하지 않으면 QUOTENAME 함수를 사용해 볼 수 있습니까 (그렇지만 그렇게 생각합니다). docs.microsoft.com/ko-kr/sql/t-sql/functions/…
MguerraTorres

1
괄호 : 같은 반응.
그 사람이

1
이 테이블이 포함 된 DB에서 다음 쿼리를 실행하고 결과를 질문에 붙여 넣으십시오 SELECT [name], CONVERT(VARBINARY(128), [name]) FROM sys.tables WHERE [name] = N'#OBSOLETE';. 감사.
솔로몬 루츠 키

2
다른 옵션 (테스트 할 시간이 없음) : 1)object_id 해당 테이블을 가져 옵니다 . 2) 단일 사용자 모드에서 인스턴스를 다시 시작하십시오. 3) 전용 관리자 연결을 통해 연결하십시오. 4) 그 DB에서와 같은 것을 시도하십시오 UPDATE sys.objects$ SET [name] =N'obsolete' WHERE [object_id] = {ye_olde_object_id}; {enter} GO {enter}. 총 가치 ..
솔로몬 Rutzky

답변:


16

주어진:

  1. sp_rename 객체 ID 대신 객체 이름을 사용합니다.
  2. 객체 이름은 a로 시작하고 #특별한 의미를 지니는 것으로 해석되어 다르게 처리 되므로 사용할 수 없습니다 .
  3. 다른 모든 옵션은 소진되었습니다

DAC (Dedicated Admin Console) 연결을 통해 기본 시스템 카탈로그 테이블을 직접 편집해야 합니다 .

  1. object_id그 테이블을 가져 옵니다 .
  2. 단일 사용자 모드에서 인스턴스를 다시 시작하십시오. 이를 통해 시스템 테이블을 직접 업데이트 할 수 있습니다 (즉, DAC 연결을 사용하지 않아도 됨).
  3. 전용 관리 콘솔 연결을 통해 연결하십시오. 명령 프롬프트 창에서 다음을 실행하여 SQLCMD 대화식 세션에서이를 수행 할 수 있습니다.

    C:\> SQLCMD -A -E

    또는 다음을 사용하여 DB에 직접 연결하십시오.

    C:\> SQLCMD -A -E -d {database_name}
  4. 해당 DB에서 다음과 같은 것을 시도하십시오.

    UPDATE sys.objects$ {enter}
    SET [name] = N'obsolete' {enter}
    WHERE [object_id] = {ye_olde_object_id}; {enter}
    GO {enter}

    에 넣을 때까지 명령문을 실행하지 않습니다 GO {enter}.

시스템 카탈로그 테이블을 직접 편집 할 때는주의해야하며 그렇게하는 데 너무 익숙하지 않습니다. 이것은 문제를 해결하는 다른 방법이 전혀없는 경우 에만 수행해야합니다 (예 : 여기). 직접 편집하지 않는 데는 몇 가지 이유가있을 수 있지만 처음에 떠오르는 두 가지 이유는 다음과 같습니다.

  • 우리가 만든 데이터 모델과 마찬가지로, 우리가 모르는 일들이 어떻게 작동하는지에 대한 규칙과 워크 플로가있을 것입니다 (예 : 비정규 화, 다양한 테이블의 데이터 상태를 관리하는 "비즈니스"규칙 등)
  • 직접 편집하면 문제가 발생하여 지원 계약을 체결 한 경우 Microsoft가 귀하를 지원할 책임이 없습니다 (지원 계약의 조항을 보지 못했지만 그러한 언어가 해당 언어에 해당되지 않는다고 생각하는 데 어려움을 겪고 있음) 그곳에)

    @Paul Randal관련 답변 에 대한 의견에서 다음 같이 확인했습니다 . "시스템 테이블을 수동으로 편집하면 데이터베이스의 부팅 페이지에 데이터베이스를 이런 식으로 편집 된 것으로 표시하는 플래그를 설정하는 것이 불가피 하며 CSS는 도움이되지 않기로 결정할 수 있습니다. 나중에 해당 데이터베이스에 문제가있는 경우 "


4
나는 대답이 마음에 들지만 이것이 왜 그렇게 위험한 지에 대한 문장을 추가 할 가치가 있습니까?
Joe Obbish

@JoeObbish 감사합니다. 좋은 제안입니다. 나는 내일 무언가를 추가하려고 노력할 것입니다.
솔로몬 Rutzky

2
@JoeObbish 방금 뭔가 추가했습니다. 충분합니까?
솔로몬 루츠 키
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.