Die Schemabindung eines Objekts wie einer benutzerdefinierten Funktion (UDF) gilt als bewährte Methode, da sie verhindert, dass Änderungen an Objekten vorgenommen werden, auf die sie verweist, die die Funktion versehentlich beschädigen könnten.
Sie können eine benutzerdefinierte Funktion beim Erstellen an ein Schema binden oder später ändern.
Normalerweise können Sie überprüfen, ob eine UDF in SQL Server schemagebunden ist, indem Sie ihre Definition anzeigen. Sie können dies normalerweise über die GUI tun, indem Sie „Script as Create“ oder ähnliches auswählen.
Sie können dies auch mit T-SQL tun, indem Sie die definition
auswählen Spalte der sys.sql_modules
Systemkatalogansicht.
Dies funktioniert jedoch nur, wenn die UDF nicht verschlüsselt ist.
Es gibt jedoch eine weitere Spalte in sys.sql_modules
Ansicht, die unserem Zweck dient, unabhängig davon, ob die UDF verschlüsselt ist oder nicht:is_schema_bound
Beispiel 1 – Verschlüsseltes UDF
Hier ist ein Beispiel, wie Sie herausfinden, ob eine verschlüsselte benutzerdefinierte Funktion namens udf_CatsByName_ITVF
schemagebunden ist oder nicht.
SELECT definition, is_schema_bound FROM sys.sql_modules WHERE object_id = OBJECT_ID('udf_CatsByName_ITVF');
Ergebnis:
+--------------+-------------------+ | definition | is_schema_bound | |--------------+-------------------| | NULL | 1 | +--------------+-------------------+
In diesem Fall ist die UDF schemagebunden.
Beachten Sie auch, dass die definition
-Spalte gibt NULL zurück, da auf die Funktion Verschlüsselung angewendet wurde.
Beispiel 2 – UDF ohne Verschlüsselung
Wenn keine Verschlüsselung angewendet worden wäre, hätten wir die vollständige Definition in dieser Spalte sehen können, und wir hätten das Argument WITH SCHEMABINDING
gesehen in der Definition.
Hier nochmal die Abfrage, wenn die Funktion nicht verschlüsselt ist.
SELECT definition FROM sys.sql_modules WHERE object_id = OBJECT_ID('udf_CatsByName_ITVF');
Ergebnis:
+--------------+ | definition | |--------------| | CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) RETURNS TABLE WITH SCHEMABINDING AS RETURN ( SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @CatName ); | +--------------+
Ich habe is_schema_bound
entfernt Spalte aus der Abfrage, um sie leichter lesbar zu machen.
In jedem Fall ist is_schema_bound
Spalte kann unabhängig davon verwendet werden, ob die UDF verschlüsselt ist oder nicht.