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.