sql >> Databasteknik >  >> RDS >> Database

Hur man kontrollerar om en T-SQL UDF är schemabunden (även när den är krypterad)

Schemabindning av ett objekt såsom en användardefinierad funktion (UDF) anses vara god praxis, eftersom det förhindrar att ändringar görs på objekt som det refererar till som oavsiktligt kan bryta funktionen.

Du kan schemabinda en användardefinierad funktion när du skapar den, eller så kan du ändra senare.

Normalt kan du kontrollera om en UDF är schemabunden i SQL Server genom att se dess definition. Du kan vanligtvis göra detta via GUI genom att välja "Skript som Skapa" eller liknande.

Du kan också göra det med T-SQL genom att välja definition kolumnen i sys.sql_modules systemkatalogvy.

Men detta fungerar bara om UDF inte är krypterad.

Det finns dock en annan kolumn i sys.sql_modules vy som tjänar vårt syfte oavsett om UDF är krypterad eller inte:is_schema_bound

Exempel 1 – Krypterad UDF

Här är ett exempel på att ta reda på om en krypterad användardefinierad funktion som heter udf_CatsByName_ITVF är schemabunden eller inte.

SELECT 
  definition,
  is_schema_bound
FROM sys.sql_modules
WHERE object_id = OBJECT_ID('udf_CatsByName_ITVF');

Resultat:

+--------------+-------------------+
| definition   | is_schema_bound   |
|--------------+-------------------|
| NULL         | 1                 |
+--------------+-------------------+

I det här fallet är UDF:n schemabunden.

Lägg också märke till att definition kolumnen returnerar NULL eftersom funktionen har tillämpat kryptering.

Exempel 2 – UDF utan kryptering

Om kryptering inte hade tillämpats kunde vi ha sett hela definitionen i den kolumnen, och vi skulle ha sett argumentet WITH SCHEMABINDING i definitionen.

Här är frågan igen när funktionen inte är krypterad.

SELECT 
  definition
FROM sys.sql_modules
WHERE object_id = OBJECT_ID('udf_CatsByName_ITVF');

Resultat:

+--------------+
| 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
    );

              |
+--------------+

Jag har tagit bort is_schema_bound kolumn från frågan för att göra den lättare att läsa.

Hur som helst, is_schema_bound kolumnen kan användas oavsett om UDF är krypterad eller inte.


  1. Generera DEFAULT-värden i en CTE UPSERT med PostgreSQL 9.3

  2. MySQL AUTO_INCREMENT rullar inte tillbaka

  3. Använder SQLCipher med Android

  4. Ställa in och identifiera radmål i genomförandeplaner