다음을 통해 공유


사용자 정의 형식 구현

이 항목에서는 SQL Server에서 CLR(공용 언어 런타임) 사용자 정의 형식을 만들고 삭제하는 방법에 대해 설명합니다.

사용자 정의 형식 만들기

SQL Server에서 사용자 정의 형식을 만들려면 다음 단계를 순서대로 수행해야 합니다.

  • Microsoft .NET Framework에서 지원하는 언어의 클래스나 구조로 사용자 정의 형식을 정의합니다. CLR에서 유형을 프로그래밍하는 방법은 CLR 프로그래밍 기능 예제를 참조하십시오. 예제에 대한 자세한 내용은 SQL Server 예제 및 예제 데이터베이스 설치 시 고려 사항을 참조하십시오. 그런 다음 적절한 언어 컴파일러로 클래스나 구조를 컴파일하여 .NET Framework에서 어셈블리를 빌드합니다.

  • CREATE ASSEMBLY 문을 사용하여 SQL Server에 어셈블리를 등록합니다. SQL Server의 어셈블리에 대한 자세한 내용은 어셈블리(데이터베이스 엔진)를 참조하십시오.

  • 등록된 어셈블리를 참조하는 사용자 정의 형식을 만듭니다.

[!참고]

Microsoft Visual Studio에서 SQL Server 프로젝트를 배포하면 해당 프로젝트에 대해 지정된 데이터베이스에 어셈블리가 등록됩니다. 또한 프로젝트를 배포하면 SqlUserDefinedType 특성으로 주석이 지정된 모든 클래스 정의에 대해 데이터베이스에서 CLR 사용자 정의 형식을 만듭니다. 자세한 내용은 CLR 데이터베이스 개체 배포를 참조하십시오.

[!참고]

기본적으로 SQL Server에서 CLR 코드 실행 기능은 OFF로 설정되어 있습니다. 관리 코드 모듈을 참조하는 데이터베이스 개체를 만들고, 수정하고, 삭제할 수 있지만 sp_configure를 사용하여 clr enabled 옵션을 설정해야만 SQL Server에서 이러한 참조가 실행됩니다.

어셈블리를 작성, 수정 또는 삭제하려면

사용자 정의 형식을 만들려면

사용자 정의 형식 삭제

사용자 정의 형식을 삭제하려면

[!참고]

사용자 정의 형식을 만든 후에는 변경할 수 없습니다. 변경 내용으로 인해 테이블이나 인덱스의 데이터가 무효화될 수 있기 때문입니다. 유형을 수정하려면 해당 유형을 삭제하고 다시 만들거나 WITH UNCHECKED DATA 절을 사용하여 ALTER ASSEMBLY 문을 실행해야 합니다.

해당 유형에 대한 참조를 모두 제거하기 전에는 사용자 정의 형식을 삭제할 수 없습니다. 제거해야 하는 참조는 다음과 같습니다.

  • 해당 유형에 대해 정의된 열

  • 식에서 해당 유형을 참조하는 계산 열 및 CHECK 제약 조건

  • 해당 유형을 참조하여 정의된 식이 있는 스키마 바운드 뷰 및 함수

  • 함수와 저장 프로시저의 매개 변수

사용자 정의 형식에 종속된 열을 찾으려면

다음 예에서는 사용자 정의 형식 ComplexNumber에 정의된 열에 대한 메타데이터를 검색합니다.

SELECT * FROM sys.columns 
WHERE user_type_id = TYPE_ID('ComplexNumber');

다음 예에서는 사용자 정의 형식 ComplexNumber에 정의된 열에 대해 최소 권한이 부여된 사용자의 제한된 메타데이터를 검색합니다.

SELECT * FROM sys.column_type_usages 
WHERE user_type_id = TYPE_ID('ComplexNumber');

사용자 정의 형식에 종속된 계산 열 식, CHECK 제약 조건 식 및 모듈 식을 찾으려면

다음 예에서는 사용자 정의 형식 SimpleUdt에 종속된 계산 열과 해당 테이블의 이름을 검색합니다.

SELECT OBJECT_SCHEMA_NAME (referencing_id) AS referencing_schema_name,
    OBJECT_NAME(referencing_id) AS referencing_name,
    COL_NAME(referencing_id, referencing_minor_id) AS column_name,
    is_caller_dependent,
    is_ambiguous
FROM sys.sql_expression_dependencies
WHERE referenced_id = TYPE_ID('SimpleUdt')
    AND referenced_class = 6 
    AND OBJECTPROPERTY(referencing_id, 'IsTable')=1; 

다음 예에서는 사용자 정의 형식 SimpleUdt에 종속된 CHECK 제약 조건 이름과 정의된 제약 조건의 개체 이름을 검색합니다.

SELECT SCHEMA_NAME(o.schema_id) AS schema_name,
    OBJECT_NAME(o.parent_object_id) AS table_name,
    OBJECT_NAME(o.object_id) AS constraint_name
FROM sys.sql_expression_dependencies AS d
JOIN sys.objects AS o
ON o.object_id = d.referencing_id
WHERE referenced_id = TYPE_ID('SimpleUdt')
AND referenced_class = 6 
AND OBJECTPROPERTY(o.object_id, 'IsCheckCnst')=1;

다음 예에서는 사용자 정의 형식 SimpleUdt를 참조하여 정의된 모듈의 이름을 검색합니다.

USE AdventureWorks2008R2;
GO
SELECT referencing_schema_name, referencing_entity_name, referencing_id, referencing_class_desc, is_caller_dependent
FROM sys.dm_sql_referencing_entities ('SimpleUdt', 'TYPE');
GO

사용자 정의 형식에 종속된 매개 변수를 찾으려면

다음 예에서는 사용자 정의 형식 ComplexNumber에 정의된 종속된 매개 변수 이름과 해당 매개 변수가 속한 개체의 이름을 검색합니다.

SELECT OBJECT_NAME(object_id) AS object_name,
    NULL AS procedure_number,
    name AS param_name,
    parameter_id AS param_num,
    TYPE_NAME(p.user_type_id) AS type_name
FROM sys.parameters AS p
WHERE p.user_type_id = TYPE_ID('ComplexNumber')
ORDER BY object_name, procedure_number, param_num;

다음 예에서는 사용자 정의 형식 ComplexNumber에 정의된 매개 변수에 대해 최소 권한이 부여된 사용자의 제한된 메타데이터를 검색합니다.

SELECT * FROM sys.parameter_type_usages 
WHERE user_type_id = TYPE_ID('ComplexNumber');