L'associazione dello schema di un oggetto come una funzione definita dall'utente (UDF) è considerata una buona pratica, poiché impedisce che vengano apportate modifiche a qualsiasi oggetto a cui fa riferimento che potrebbe interrompere inavvertitamente la funzione.
Puoi associare allo schema una funzione definita dall'utente nel momento in cui la crei, oppure puoi modificarla in un secondo momento.
Normalmente è possibile verificare se una UDF è associata a uno schema in SQL Server visualizzandone la definizione. Di solito puoi farlo tramite la GUI selezionando "Script as Create" o simili.
Puoi anche farlo usando T-SQL selezionando la definition
colonna del sys.sql_modules
vista catalogo di sistema.
Ma questo funzionerà solo se l'UDF non è crittografato.
Tuttavia, c'è un'altra colonna in sys.sql_modules
vista che serve al nostro scopo, indipendentemente dal fatto che l'UDF sia crittografato o meno:is_schema_bound
Esempio 1 – UDF crittografato
Ecco un esempio per scoprire se una funzione crittografata definita dall'utente chiamata udf_CatsByName_ITVF
è legato allo schema o meno.
SELECT definition, is_schema_bound FROM sys.sql_modules WHERE object_id = OBJECT_ID('udf_CatsByName_ITVF');
Risultato:
+--------------+-------------------+ | definition | is_schema_bound | |--------------+-------------------| | NULL | 1 | +--------------+-------------------+
In questo caso, l'UDF è associato allo schema.
Si noti inoltre che la definition
colonna restituisce NULL perché alla funzione è stata applicata la crittografia.
Esempio 2 – UDF senza crittografia
Se la crittografia non fosse stata applicata, avremmo potuto vedere la definizione completa in quella colonna e avremmo visto l'argomento WITH SCHEMABINDING
nella definizione.
Ecco di nuovo la query quando la funzione non è crittografata.
SELECT definition FROM sys.sql_modules WHERE object_id = OBJECT_ID('udf_CatsByName_ITVF');
Risultato:
+--------------+ | 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 ); | +--------------+
Ho rimosso is_schema_bound
colonna della query per facilitarne la lettura.
In ogni caso, is_schema_bound
colonna può essere utilizzata indipendentemente dal fatto che l'UDF sia crittografato o meno.