2013-10-28 1 views
4

나는이 문을 SQL 서버 2008R2/2012 사용자 정의 테이블 형식을 만드는거야 작동하지 않는 스키마 유형을 만들 수 있습니다.SQL 서버는 사용자 정의 테이블 제대로

나는 또한 관련된 모든 객체를 주어진 스키마로 삭제하는 저장 프로 시저를 가지고있다. 내 사용자 정의 테이블 형식이 제대로 작동하지 않는 곳입니다. 이러한 유형이 연결된 스키마로 생성 될 것으로 예상됩니다.

스키마를 삭제하려고하면 스키마가 내 사용자 정의 테이블 형식과 연결되어 있다고 불평합니다. 따라서 삭제되지 않습니다.

하지만 내 데이터베이스에서 TYPE_TABLE 인 모든 개체를 쿼리하면 내 테이블 유형이 내 스키마에 속하지 않는다고 알려줍니다. 스키마 'sys'에 속합니다.

SELECT name, schema_id, type_desc 
FROM [TESTDB].SYS.OBJECTS 
WHERE type_desc = 'TYPE_TABLE'; 

SELECT * FROM sys.schemas; 

왜 그런가? 여기

내 출력 enter image description here

+0

이 예상되는 동작하므로 사용자 정의 형식은 항상 "SYS"스키마에 할당되었는지에 대한 이해입니다 통해 서로 관련이 있습니다. 사용자 정의 스키마를 함수, 프로 시저, 테이블 및 트리거에 할당 할 수 있습니다. – talegna

답변

5

대신 이들에 대한 sys.objects에서 찾고에서 스크린 샷 당신이 (이 추가적으로 type_table_object_id를 노출) sys.types 또는 sys.table_types에 보일 것입니다. 당신이 유형에 정의 된 사용자를 만들 때

SELECT name, 
     schema_id /*Will be the "test" schema id*/ 
FROM sys.types 
WHERE is_table_type = 1 
     AND name = 'MyUserTableType' 

IT는 사용자가 제공 한 스키마와 이름과 sys 스키마의 시스템으로 생성 된 이름 sys.sysschobjs에 행과 sys.sysscalartypes에 행을 추가합니다. 시스템 생성 이름은 TT_ + FriendlyName + _ + 16 진수 버전의 오브젝트 ID를 연결하여 생성됩니다.

두 기관은 sys.syssingleobjrefs

/*This query only works via the DAC*/ 
SELECT so.id AS object_id, 
     st.id AS user_type_id, 
     * 
FROM sys.sysschobjs so 
     JOIN sys.syssingleobjrefs sor 
     ON sor.indepid = so.id 
     JOIN sys.sysscalartypes st 
     ON st.id = sor.depid 
WHERE st.name = 'MyUserTableType' 
관련 문제