Database
 sql >> Database >  >> RDS >> Database

Come verificare se un UDF T-SQL è associato allo schema (anche quando è crittografato)

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.