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.