Implementieren benutzerdefinierter Typen

Aktualisiert: 14. April 2006

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 CLR User-Defined Types. 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.
ms179298.note(de-de,SQL.90).gifHinweis:
Bei der Bereitstellung eines SQL Server-Projekts in Microsoft Visual Studio wird eine Assembly in der Datenbank registriert, die für das Projekt angegeben wurde. 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 Deploying CLR Database Objects.
ms179298.note(de-de,SQL.90).gifHinweis:
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

ms179298.note(de-de,SQL.90).gifHinweis:
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 schemagebundene Sicht- und Funktionsausdrü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 ComplexNumber abgerufen.

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; 

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 ComplexNumber 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_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;

Im folgenden Beispiel werden die Namen von schemagebundenen Funktionen und Sichten abgerufen, deren Definitionen auf den benutzerdefinierten Typ ComplexNumber verweisen.

ms179298.note(de-de,SQL.90).gifHinweis:
SQL Server verwaltet keine Metadaten zu Abhängigkeiten zwischen benutzerdefinierten Typen und deren Verwendung im Hauptteil von gespeicherten Prozeduren, Triggern, nicht-schemagebundenen Funktionen oder nicht-schemagebundenen Sichten.
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;

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

Siehe auch

Konzepte

Arbeiten mit CLR-benutzerdefinierten Typen

Andere Ressourcen

Beispiele für die CLR-Programmierbarkeit

Hilfe und Informationen

Informationsquellen für SQL Server 2005

Änderungsverlauf

Version Verlauf

14. April 2006

Neuer Inhalt:
  • Der Abschnitt "Löschen benutzerdefinierter Typen" mit Informationen zum Auffinden der Abhängigkeiten von benutzerdefinierten Typen wurde hinzugefügt.