Freigeben über


Datenbankübergreifendes Verwenden benutzerdefinierter Datentypen

Wenn Sie einen benutzerdefinierten Datentyp erstellen, ist dieser für eine einzelne Datenbank lokal. Aus diesem Grund kann ein benutzerdefinierter Datentyp, der in einer Datenbank definiert wurde, nicht in einer Spaltendefinition einer anderen Datenbank verwendet werden. Wenn der gleiche benutzerdefinierte Datentyp jedoch registriert wird und der Zugriff darauf in zwei Datenbanken erfolgen kann, können Sie einen benutzerdefinierten Typwert aus einer Datenbank für die Verwendung in einer anderen Datenbank konvertieren. Dies bietet sich an, wenn Sie Folgendes ausführen möchten:

  • Aufrufen einer gespeicherten Prozedur, die in einer anderen Datenbank definiert ist.

  • Ausführen von Abfragen mit Tabellen, die in zwei verschiedenen Datenbanken definiert sind.

  • Auswählen von Daten aus einer Datenbank und Einfügen der Daten in eine andere Datenbank.

Angenommen, der benutzerdefinierte Datentyp u1 wird z. B. in der Datenbank db1 und in der Datenbank db2 erstellt. Die gespeicherte Prozedur p2 wird nur in der Datenbank db2 erstellt und nimmt einen Parameter des Typs u1 an. Sie können die gespeicherte Prozedur p2 mit einer Instanz vom Typ u1 aus db1 aufrufen.

USE db1
DECLARE @u u1
EXEC db2.dbo.p2 @u
GO

Ein weiteres Beispiel bezieht sich auf das Auffüllen einer temporären Tabelle in tempdb mit den Ergebnissen einer Abfrage. Der benutzerdefinierte Datentyp muss in tempdb registriert sein, damit diese Operation erfolgreich ist.

INSERT INTO #t SELECT * FROM T 

Das Registrieren eines benutzerdefinierten Datentyps in tempdb ist nicht erforderlich, wenn Sie einen benutzerdefinierten Datentyp in einer Tabellenvariablen verwenden oder wenn ein Cursor den benutzerdefinierten Datentyp in einer Arbeitstabelle verwendet.

Wenn Sie benutzerdefinierte Datentypen datenbankübergreifend verwenden, sollten Sie Folgendes berücksichtigen:

  • Die Datentypen müssen den gleichen Namen besitzen (dies schließt den CLR-Namen ein), und sie müssen über die gleiche Assembly in beiden Datenbanken implementiert sein. Assemblys in zwei Datenbanken sind identisch, wenn in ihnen Folgendes gleich ist: Name, starker Name, Kultur, Version, Codezugriffs-Berechtigungssatz und binäre Inhalte.

  • Sie müssen SELECT- und EXECUTE-Berechtigungen für jede Spalte des benutzerdefinierten Datentyps besitzen, auf die in der Abfrage verwiesen wird. Diese Berechtigungen werden in Bezug auf die Datenbank überprüft, in der jede Spalte definiert ist.

  • Wenn ein Datentyp, der in einer Assembly implementiert ist, eine Methode in einer anderen Assembly aufruft, wird der assemblyübergreifende Aufruf auf die gleiche Weise überprüft wie bei einer nicht datenbankübergreifenden Ausgabe der Abfrage mit dem benutzerdefinierten Datentyp.