sql >> Databáze >  >> RDS >> Database

Jak zkontrolovat, zda je T-SQL UDF vázaný na schéma (i když je šifrovaný)

Vazba schématu na objekt, jako je uživatelsky definovaná funkce (UDF), se považuje za osvědčený postup, protože zabraňuje provádění změn na objektech, na které odkazuje, které by mohly funkci neúmyslně přerušit.

Uživatelem definovanou funkci můžete svázat schématem v době, kdy ji vytváříte, nebo ji můžete později změnit.

Normálně můžete zkontrolovat, zda je UDF v SQL Server vázáno schématem, zobrazením jeho definice. Obvykle to můžete provést prostřednictvím GUI výběrem „Script as Create“ nebo podobně.

Můžete to udělat také pomocí T-SQL výběrem definition sloupec sys.sql_modules zobrazení systémového katalogu.

To však bude fungovat pouze v případě, že UDF není zašifrováno.

V sys.sql_modules je však další sloupec zobrazení, které slouží našemu účelu bez ohledu na to, zda je UDF zašifrováno nebo ne:is_schema_bound

Příklad 1 – Šifrované UDF

Zde je příklad, jak zjistit, zda je šifrovaná uživatelsky definovaná funkce s názvem udf_CatsByName_ITVF je nebo není vázáno na schéma.

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

Výsledek:

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

V tomto případě je UDF vázán na schéma.

Všimněte si také, že definition vrátí hodnotu NULL, protože funkce použila šifrování.

Příklad 2 – UDF bez šifrování

Pokud by nebylo použito šifrování, mohli bychom v tomto sloupci vidět úplnou definici a viděli bychom argument WITH SCHEMABINDING v definici.

Zde je dotaz znovu, když funkce není zašifrována.

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

Výsledek:

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

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

Odstranil jsem is_schema_bound sloupec z dotazu, aby byl snáze čitelný.

Ať tak či onak, is_schema_bound lze použít bez ohledu na to, zda je UDF šifrováno nebo ne.


  1. Uvolněte velmi rozsáhlé databáze

  2. Android SQLiteDB nedokončuje přidávání hodnot

  3. GreenDAO podporuje více vztahů mezi tabulkami

  4. Recenze knihy :Benjamin Nevarez:Query Tuning &Optimization