Реализация определяемых пользователем типов данных
В данном разделе описано создание и удаление определяемых пользователем типов данных среды CLR в SQL Server.
Создание определяемых пользователем типов данных
Для создания определяемого пользователем типа данных в SQL Server следует выполнить следующие действия в указанном порядке.
Определить определяемый пользователем тип как класс или структуру на языке, поддерживаемом Microsoft.NET Framework. Дополнительные сведения о программировании типов данных CLR см. в разделе Определяемые пользователем типы данных CLR. Затем скомпилировать этот класс или структуру для создания сборки на платформе .NET Framework при помощи компилятора соответствующего языка.
Зарегистрируйте эту сборку в SQL Server с помощью инструкции CREATE ASSEMBLY. Дополнительные сведения о сборках в SQL Server см. в разделе Сборки (компонент Database Engine).
Создать тип, ссылающийся на зарегистрированную сборку.
Примечание |
---|
Развертывание проекта SQL Server в MicrosoftVisual 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 AdventureWorks;
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');
См. также