Schemabindning av ett objekt såsom en användardefinierad funktion (UDF) anses vara god praxis, eftersom det förhindrar att ändringar görs på objekt som det refererar till som oavsiktligt kan bryta funktionen.
Du kan schemabinda en användardefinierad funktion när du skapar den, eller så kan du ändra senare.
Normalt kan du kontrollera om en UDF är schemabunden i SQL Server genom att se dess definition. Du kan vanligtvis göra detta via GUI genom att välja "Skript som Skapa" eller liknande.
Du kan också göra det med T-SQL genom att välja definition
kolumnen i sys.sql_modules
systemkatalogvy.
Men detta fungerar bara om UDF inte är krypterad.
Det finns dock en annan kolumn i sys.sql_modules
vy som tjänar vårt syfte oavsett om UDF är krypterad eller inte:is_schema_bound
Exempel 1 – Krypterad UDF
Här är ett exempel på att ta reda på om en krypterad användardefinierad funktion som heter udf_CatsByName_ITVF
är schemabunden eller inte.
SELECT definition, is_schema_bound FROM sys.sql_modules WHERE object_id = OBJECT_ID('udf_CatsByName_ITVF');
Resultat:
+--------------+-------------------+ | definition | is_schema_bound | |--------------+-------------------| | NULL | 1 | +--------------+-------------------+
I det här fallet är UDF:n schemabunden.
Lägg också märke till att definition
kolumnen returnerar NULL eftersom funktionen har tillämpat kryptering.
Exempel 2 – UDF utan kryptering
Om kryptering inte hade tillämpats kunde vi ha sett hela definitionen i den kolumnen, och vi skulle ha sett argumentet WITH SCHEMABINDING
i definitionen.
Här är frågan igen när funktionen inte är krypterad.
SELECT definition FROM sys.sql_modules WHERE object_id = OBJECT_ID('udf_CatsByName_ITVF');
Resultat:
+--------------+ | 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 ); | +--------------+
Jag har tagit bort is_schema_bound
kolumn från frågan för att göra den lättare att läsa.
Hur som helst, is_schema_bound
kolumnen kan användas oavsett om UDF är krypterad eller inte.