Udostępnij za pośrednictwem


Implementowanie typów zdefiniowanych przez użytkownika

W tym temacie opisano sposób tworzenia i upuść language runtime (CLR) użytkownika typowych w SQL Server.

Tworzenie typów zdefiniowanych przez użytkownika

Aby utworzyć typ zdefiniowany przez użytkownika w SQL Server, następujące czynności należy wykonać w kolejności:

  • Define the user-defined type as a class or structure in a language supported by the Microsoft .NET Framework.Aby uzyskać więcej informacji na temat typów programów w środowisko CLR, zobacz Przykłady programowania CLR. Informacje dla próbek, zobacz Zagadnienia dotyczące instalowania przykładów i przykładowych baz danych programu SQL Server.Następnie należy skompilować klasy lub struktury do budowania wirtualny plik dziennika w .NET Framework za pomocą kompilatora odpowiedniego języka.

  • Zarejestrować wirtualny plik dziennika w SQL Server za pomocą tworzenia wirtualny plik dziennika instrukcja.Więcej informacji o zestawach w SQL Server, zobacz Zestawy (aparat bazy danych).

  • Utwórz typ, który odwołuje się do zarejestrowanego wirtualny plik dziennika.

Ostrzeżenie

Deploying a SQL Server Project in Microsoft Visual Studio registers an assembly in the database that was specified for the project.Wdrażanie projektu tworzy również CLR typy zdefiniowane przez użytkownika w bazie danych dla wszystkich definicji klas adnotacje z SqlUserDefinedType atrybut.Aby uzyskać więcej informacji, zobacz Wdrażanie CLR obiektów bazy danych.

Ostrzeżenie

Domyślnie, zdolność SQL Server wykonanie kodu CLR jest zestaw do występujeTworzenie, modyfikowanie i usuwanie obiektów bazy danych, które odwołują się do modułów kod zarządzany, ale te odwołania nie będą wykonać w SQL Server chyba że clr włączona opcja jest włączone za pomocą sp_configure.

Aby utworzyć, zmodyfikować lub usuwanie wirtualny plik dziennika

Aby utworzyć typ zdefiniowany przez użytkownika

Upuszczanie typów zdefiniowanych przez użytkownika

Aby usunąć typ zdefiniowany przez użytkownika

Ostrzeżenie

Typów zdefiniowanych przez użytkownika nie można modyfikować po ich utworzeniu, ponieważ zmiany mogłyby unieważnić dane w tabelach lub indeksy.Aby zmodyfikować typ, należy upuścić typu i następnie ją odtworzyć lub wydania ALTER zestawu instrukcja przy użyciu klauzula Z NIEZAZNACZONE danych.

Nie można usunąć typ zdefiniowany przez użytkownika, dopóki zostaną usunięte wszystkie odwołania do tego typu.Odniesienia te mogą być następujące:

  • Definicja typu kolumny.

  • Obliczona kolumny i wyrażenia, których typ odwołania ograniczeń CHECK.

  • Funkcje z wyrażeń w ich definicje, które typ odwołania i widoki związanych ze schematem.

  • Parametrów procedur przechowywanych i funkcji.

Aby znaleźć kolumny zależne od typ zdefiniowany przez użytkownika

Poniższy przykład pobiera metadane dotyczące kolumn zdefiniowanych na typ zdefiniowany przez użytkownika ComplexNumber.

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

Poniższy przykład pobiera ograniczone metadane dla najmniej uprzywilejowanych użytkowników o kolumn zdefiniowanych na typ zdefiniowany przez użytkownika ComplexNumber.

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

Aby znaleźć kolumna obliczana wyrażeń, wyboru wyrażeń ograniczeń i moduł wyrażeń zależy od typ zdefiniowany przez użytkownika

Poniższy przykład pobiera nazwy kolumny obliczane (i ich tabel) z zależnością na typ zdefiniowany przez użytkownika 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; 

Poniższy przykład pobiera nazwy ograniczenia wyboru (i obiekty, które są zdefiniowane) z zależnością od typ zdefiniowany przez użytkownika 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;

Poniższy przykład pobiera nazwy modułów, których definicje typ zdefiniowany przez użytkownika odwołania 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

Aby znaleźć parametry zależne od typ zdefiniowany przez użytkownika

Następujące pobiera przykład zdefiniowanych nazw parametrów (i obiekty, do których należą) na typ zdefiniowany przez użytkownika 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;

Poniższy przykład pobiera ograniczone metadane dla najmniej uprzywilejowanych użytkowników o parametry zdefiniowane dla typ zdefiniowany przez użytkownika ComplexNumber.

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