Поделиться через


Реализация определяемых пользователем типов

В данном разделе описано создание и удаление определяемых пользователем типов данных CLR в SQL Server.

Создание определяемых пользователем типов данных

Для создания определяемого пользователем типа данных в SQL Server следует выполнить следующие действия в указанном порядке.

  • Определить определяемый пользователем тип как класс или структуру на языке, поддерживаемом Microsoft .NET Framework. Дополнительные сведения о программировании типов данных CLR см. в разделе Образцы программирования для среды CLR. Дополнительные сведения об образцах см. в разделе Вопросы установки образцов кода и образцов баз данных SQL Server. Затем скомпилировать этот класс или структуру для создания сборки на платформе .NET Framework при помощи компилятора соответствующего языка.

  • Зарегистрируйте эту сборку в SQL Server с помощью инструкции CREATE ASSEMBLY. Дополнительные сведения о сборках в SQL Server см. в разделе Сборки (компонент Database Engine).

  • Создать тип, ссылающийся на зарегистрированную сборку.

ПримечаниеПримечание

Развертывание проекта SQL Server в Microsoft Visual Studio регистрирует сборку в базе данных, которая указана для этого проекта. Развертывание проекта также создает пользовательские типы CLR в базе данных для всех определений класса, аннотированных в атрибуте SqlUserDefinedType. Дополнительные сведения см. в разделе Развертывание объектов базы данных CLR.

ПримечаниеПримечание

По умолчанию, реализованная в SQL Server функция выполнения кода CLR имеет значение OFF. Можно создавать, изменять и удалять объекты базы данных, которые ссылаются на модули управляемого кода, но эти ссылки не будут действовать в SQL Server, если параметр clr enabled не получит значение True с помощью sp_configure.

Создание, изменение или удаление сборки

Создание определяемого пользователем типа

Удаление определяемых пользователем типов данных

Удаление определяемого пользователем типа

ПримечаниеПримечание

После создания определяемого пользователем типа его нельзя модифицировать, поскольку изменения могли бы сделать недействительными данные в таблицах или в индексах. Для изменения типа необходимо либо его удалить, либо создать его повторно, или же выполнить инструкцию ALTER ASSEMBLY с использованием предложения WITH UNCHECKED DATA.

Определяемый пользователем тип данных не может быть удален, пока не будут удалены все ссылки на него. Это могут быть следующие ссылки.

  • Столбцы, определенные на этом типе.

  • Вычисляемые столбцы и ограничения 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; 

В следующем примере получаются имена ограничений CHECK (и объектов, для которых они определены), в которых содержатся ссылки на определяемый пользователем тип SimpleUdt.

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');