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

Изменения: 14 апреля 2006 г.

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

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

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

  • Определить определяемый пользователем тип как класс или структуру на языке, поддерживаемом Microsoft .NET Framework. Дополнительные сведения о программировании типов данных CLR см. в разделе CLR User-Defined Types. Затем скомпилировать этот класс или структуру для создания сборки на платформе .NET Framework при помощи компилятора соответствующего языка.
  • Зарегистрируйте эту сборку в SQL Server с помощью инструкции CREATE ASSEMBLY. Дополнительные сведения о сборках в SQL Server см. в разделе Сборки (компонент Database Engine).
  • Создать тип, ссылающийся на зарегистрированную сборку.
ms179298.note(ru-ru,SQL.90).gifПримечание.
Развертывание проекта SQL Server в Microsoft Visual Studio регистрирует сборку в базе данных, указанной для проекта. Развертывание проекта также создает пользовательские типы CLR в базе данных для всех определений класса, аннотированных в атрибуте SqlUserDefinedType. Дополнительные сведения см. в разделе Deploying CLR Database Objects.
ms179298.note(ru-ru,SQL.90).gifПримечание.
По умолчанию, реализованная в SQL Server функция выполнения кода CLR имеет значение OFF. Можно создавать, изменять и удалять объекты базы данных, которые ссылаются на модули управляемого кода, но эти ссылки не будут действовать в SQL Server, если параметр clr enabled не получит значение True с помощью sp_configure.

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

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

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

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

ms179298.note(ru-ru,SQL.90).gifПримечание.
После создания определяемого пользователем типа его нельзя модифицировать, поскольку изменения могли бы сделать недействительными данные в таблицах или в индексах. Для изменения типа необходимо либо его удалить, либо создать его повторно, или же выполнить инструкцию 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, а также выражений, привязанных к схеме представлений, и функций, в которых имеются ссылки на определяемый пользователем тип

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

SELECT OBJECT_NAME(object_id) AS object_name,
    COL_NAME(object_id, column_id) AS column_name
FROM sys.sql_dependencies
WHERE referenced_major_id = TYPE_ID('ComplexNumber')
    AND class = 2 
    AND OBJECTPROPERTY(object_id, 'IsTable')=1; 

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

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_dependencies AS d
JOIN sys.objects AS o
ON o.object_id = d.object_id
WHERE referenced_major_id = TYPE_ID('ComplexNumber')
AND class = 2 
AND OBJECTPROPERTY(o.object_id, 'IsCheckCnst')=1;

В следующем примере получаются имена привязанных к схеме функций и представлений определения, которые имеют ссылки на определяемый пользователем тип ComplexNumber.

ms179298.note(ru-ru,SQL.90).gifПримечание.
В SQL Server не поддерживается работа с взаимосвязями метаданных между типами данных, определяемых пользователем, и их использованием в телах хранимых процедур, триггеров, не привязанных к схеме функций или не привязанных к схеме представлений.
SELECT SCHEMA_NAME(o.schema_id) AS dependent_object_schema,
    OBJECT_NAME(o.object_id) AS dependent_object_name,
    o.type_desc AS dependent_object_type,
    d.class_desc AS kind_of_dependency,
    d.referenced_major_id AS referenced_object
FROM sys.sql_dependencies AS d 
JOIN sys.objects AS o
    ON d.object_id = o.object_id
        AND o.type IN ('FN','IF','TF', 'V')
WHERE  d.class = 2
    AND d.referenced_major_id IN (TYPE_ID('ComplexNumber'))
ORDER BY dependent_object_schema, dependent_object_name;

Поиск параметров, имеющих ссылки на определяемый пользователем тип

В следующем примере получаются имена параметров (и объектов, которым они принадлежат), в определении которых содержатся ссылки на определяемый пользователем тип 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');

См. также

Основные понятия

Работа с определяемыми пользователем типами данных CLR

Другие ресурсы

Образцы программирования для среды CLR

Справка и поддержка

Получение помощи по SQL Server 2005

Журнал изменений

Версия Журнал

14 апреля 2006 г.

Добавления
  • Добавлен раздел «Удаление определяемых пользователем типов данных», а также сведения о том, как обнаружить ссылки на определяемые пользователем типы данных.