Implementieren benutzerdefinierter Typen

In diesem Thema wird das Erstellen und Löschen von benutzerdefinierten CLR-Typen (Common Language Runtime) in SQL Server beschrieben.

Erstellen benutzerdefinierter Typen

Wenn Sie einen benutzerdefinierten Typ in SQL Server erstellen möchten, müssen Sie folgende Schritte in der angegebenen Reihenfolge ausführen:

  • Definieren Sie den benutzerdefinierten Typ als eine Klasse oder Struktur in einer von Microsoft .NET Framework unterstützten Sprache. Weitere Informationen zum Programmieren von Typen in der CLR finden Sie unter Beispiele für die CLR-Programmierbarkeit. Weitere Informationen zu Beispielen finden Sie unter Überlegungen zum Installieren der SQL Server-Beispiele und -Beispieldatenbanken. Kompilieren Sie anschließend die Klasse oder Struktur mithilfe des entsprechenden Sprachcompilers, um eine Assembly in .NET Framework zu erstellen.

  • Registrieren Sie die Assembly in SQL Server mithilfe der CREATE ASSEMBLY-Anweisung. Weitere Informationen zu Assemblys in SQL Server finden Sie unter Assemblys (Database Engine).

  • Erstellen Sie den Typ, der auf die registrierte Assembly verweist.

HinweisHinweis

Beim Bereitstellen eines SQL Server-Projekts in Microsoft Visual Studio wird eine Assembly in der Datenbank registriert, die für das Projekt angegeben war. Bei der Bereitstellung des Projekts werden in der Datenbank auch benutzerdefinierte CLR-Typen für alle Klassendefinitionen erstellt, die mit dem SqlUserDefinedType-Attribut versehen sind. Weitere Informationen finden Sie unter Bereitstellen von CLR-Datenbankobjekten.

HinweisHinweis

Standardmäßig ist die Option zum Ausführen von CLR-Code für SQL Server auf OFF festgelegt. Sie können Datenbankobjekte, die auf verwaltete Codemodule verweisen, erstellen, ändern und löschen. Diese Verweise werden jedoch in SQL Server nicht ausgeführt, es sei denn, die Option clr enabled ist mit sp_configure aktiviert.

So erstellen, ändern oder löschen Sie eine Assembly

So erstellen Sie einen benutzerdefinierten Typ

Löschen benutzerdefinierter Typen

So löschen Sie einen benutzerdefinierten Typ

HinweisHinweis

Benutzerdefinierte Typen können nicht geändert werden, nachdem sie erstellt wurden, da durch Änderungen möglicherweise Daten in Tabellen oder Indizes ungültig werden. Wenn Sie einen Typ ändern möchten, müssen Sie ihn entweder löschen und anschließend neu erstellen oder mithilfe der WITH UNCHECKED DATA-Klausel eine ALTER ASSEMBLY-Anweisung ausgeben.

Sie können einen benutzerdefinierten Typ erst löschen, nachdem alle Verweise auf diesen Typ entfernt wurden. Diese Verweise können sich u. a. wie folgt zusammensetzen:

  • Für den Typ definierte Spalten.

  • Berechnete Spalten und CHECK-Einschränkungen, deren Ausdrücke auf den Typ verweisen.

  • Schemagebundene Sichten und Funktionen mit Ausdrücken in ihren Definitionen, die auf den Typ verweisen.

  • Parameter von Funktionen und gespeicherten Prozeduren

So finden Sie Spalten, die von einem benutzerdefinierten Typ abhängig sind

Im folgenden Beispiel werden Metadaten zu für den benutzerdefinierten Typ ComplexNumber definierten Spalten abgerufen.

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

Im folgenden Beispiel werden beschränkte Metadaten für Benutzer mit minimalen Privilegien zu für den benutzerdefinierten Typ ComplexNumber definierten Spalten abgerufen.

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

So finden Sie berechnete Spaltenausdrücke, CHECK-Einschränkungsausdrücke und Modulausdrücke, die von einem benutzerdefinierten Typ abhängig sind

Im folgenden Beispiel werden die Namen von berechneten Spalten (und ihre Tabellen) mit einer Abhängigkeit vom benutzerdefinierten Typ SimpleUdt abgerufen.

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; 

Im folgenden Beispiel werden die Namen von CHECK-Einschränkungen (und der Objekte, für die sie definiert sind) mit einer Abhängigkeit vom benutzerdefinierten Typ SimpleUdt abgerufen.

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;

Im folgenden Beispiel werden die Namen von Modulen abgerufen, deren Definitionen auf den benutzerdefinierten Typ SimpleUdt verweisen.

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

So finden Sie Parameter, die von einem benutzerdefinierten Typ abhängig sind

Im folgenden Beispiel werden die Namen von Parametern (und der Objekte, zu denen sie gehören) abgerufen, die für den benutzerdefinierten Typ ComplexNumber definiert sind.

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;

Im folgenden Beispiel werden beschränkte Metadaten für Benutzer mit minimalen Privilegien zu für den benutzerdefinierten Typ ComplexNumber definierten Parametern abgerufen.

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