Schema dat een object bindt, zoals een door de gebruiker gedefinieerde functie (UDF), wordt als een goede gewoonte beschouwd, omdat het voorkomt dat er wijzigingen worden aangebracht aan objecten waarnaar het verwijst en die de functie per ongeluk zouden kunnen verbreken.
U kunt een door de gebruiker gedefinieerde functie in een schema binden op het moment dat u deze maakt, of u kunt deze later wijzigen.
Normaal gesproken kunt u controleren of een UDF schemagebonden is in SQL Server door de definitie ervan te bekijken. U kunt dit meestal doen via de GUI door "Script as Create" of iets dergelijks te selecteren.
Je kunt het ook doen met T-SQL door de definition
te selecteren kolom van de sys.sql_modules
systeemcatalogusweergave.
Maar dit werkt alleen als de UDF niet is versleuteld.
Er is echter nog een kolom in de sys.sql_modules
weergave die ons doel dient, of de UDF nu versleuteld is of niet:is_schema_bound
Voorbeeld 1 – Versleutelde UDF
Hier is een voorbeeld om erachter te komen of een gecodeerde, door de gebruiker gedefinieerde functie met de naam udf_CatsByName_ITVF
is schema gebonden of niet.
SELECT definition, is_schema_bound FROM sys.sql_modules WHERE object_id = OBJECT_ID('udf_CatsByName_ITVF');
Resultaat:
+--------------+-------------------+ | definition | is_schema_bound | |--------------+-------------------| | NULL | 1 | +--------------+-------------------+
In dit geval is de UDF schemagebonden.
Merk ook op dat de definition
kolom retourneert NULL omdat op de functie codering is toegepast.
Voorbeeld 2 – UDF zonder versleuteling
Als er geen versleuteling was toegepast, hadden we de volledige definitie in die kolom kunnen zien en hadden we het argument WITH SCHEMABINDING
gezien. in de definitie.
Hier is de vraag opnieuw wanneer de functie niet is gecodeerd.
SELECT definition FROM sys.sql_modules WHERE object_id = OBJECT_ID('udf_CatsByName_ITVF');
Resultaat:
+--------------+ | 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 ); | +--------------+
Ik heb de is_schema_bound
. verwijderd kolom uit de zoekopdracht om het leesbaarder te maken.
Hoe dan ook, de is_schema_bound
kolom kan worden gebruikt, ongeacht of de UDF is versleuteld of niet.