Database
 sql >> Base de données >  >> RDS >> Database

Comment vérifier si une UDF T-SQL est liée au schéma (même lorsqu'elle est chiffrée)

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.