La liaison de schéma à un objet tel qu'une fonction définie par l'utilisateur (UDF) est considérée comme une bonne pratique, car elle empêche que des modifications soient apportées à tous les objets auxquels il fait référence qui pourraient interrompre la fonction par inadvertance.
Vous pouvez lier au schéma une fonction définie par l'utilisateur au moment où vous la créez, ou vous pouvez la modifier ultérieurement.
Normalement, vous pouvez vérifier si une UDF est liée au schéma dans SQL Server en affichant sa définition. Vous pouvez généralement le faire via l'interface graphique en sélectionnant "Script as Create" ou similaire.
Vous pouvez également le faire en utilisant T-SQL en sélectionnant la definition
colonne du sys.sql_modules
vue du catalogue système.
Mais cela ne fonctionnera que si l'UDF n'est pas crypté.
Cependant, il y a une autre colonne dans le sys.sql_modules
vue qui sert notre objectif, que l'UDF soit chiffré ou non :is_schema_bound
Exemple 1 – UDF chiffré
Voici un exemple pour savoir si une fonction chiffrée définie par l'utilisateur appelée udf_CatsByName_ITVF
est lié au schéma ou non.
SELECT definition, is_schema_bound FROM sys.sql_modules WHERE object_id = OBJECT_ID('udf_CatsByName_ITVF');
Résultat :
+--------------+-------------------+ | definition | is_schema_bound | |--------------+-------------------| | NULL | 1 | +--------------+-------------------+
Dans ce cas, la FDU est liée au schéma.
Notez également que la definition
La colonne renvoie NULL car le chiffrement a été appliqué à la fonction.
Exemple 2 – UDF sans chiffrement
Si le chiffrement n'avait pas été appliqué, nous aurions pu voir la définition complète dans cette colonne, et nous aurions vu l'argument WITH SCHEMABINDING
dans la définition.
Voici à nouveau la requête lorsque la fonction n'est pas chiffrée.
SELECT definition FROM sys.sql_modules WHERE object_id = OBJECT_ID('udf_CatsByName_ITVF');
Résultat :
+--------------+ | 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 ); | +--------------+
J'ai supprimé le is_schema_bound
colonne de la requête pour en faciliter la lecture.
Dans tous les cas, le is_schema_bound
peut être utilisée que l'UDF soit cryptée ou non.