Skemabinding af et objekt såsom en brugerdefineret funktion (UDF) betragtes som god praksis, da det forhindrer ændringer i objekter, som det refererer til, og som utilsigtet kan bryde funktionen.
Du kan skemabinde en brugerdefineret funktion på det tidspunkt, du opretter den, eller du kan ændre senere.
Normalt kan du kontrollere, om en UDF er skemabundet i SQL Server ved at se dens definition. Du kan normalt gøre dette via GUI'en ved at vælge "Script as Create" eller lignende.
Du kan også gøre det ved at bruge T-SQL ved at vælge definition
kolonne i sys.sql_modules
systemkatalogvisning.
Men dette vil kun fungere, hvis UDF'en ikke er krypteret.
Der er dog en anden kolonne i sys.sql_modules
visning, der tjener vores formål, uanset om UDF'en er krypteret eller ej:is_schema_bound
Eksempel 1 – Krypteret UDF
Her er et eksempel på at finde ud af, om en krypteret brugerdefineret funktion kaldet udf_CatsByName_ITVF
er skemabundet eller ej.
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 dette tilfælde er UDF'en skemabundet.
Bemærk også, at definition
kolonne returnerer NULL, fordi funktionen har fået anvendt kryptering.
Eksempel 2 – UDF uden kryptering
Hvis kryptering ikke var blevet anvendt, kunne vi have set den fulde definition i den kolonne, og vi ville have set argumentet WITH SCHEMABINDING
i definitionen.
Her er forespørgslen igen, når funktionen ikke er krypteret.
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 ); | +--------------+
Jeg har fjernet is_schema_bound
kolonne fra forespørgslen for at gøre det nemmere at læse.
Uanset hvad, er is_schema_bound
kolonne kan bruges, uanset om UDF'en er krypteret eller ej.