Schemat powiązania obiektu, takiego jak funkcja zdefiniowana przez użytkownika (UDF), jest uważany za dobrą praktykę, ponieważ zapobiega wprowadzaniu zmian w obiektach, do których się odwołuje, które mogłyby przypadkowo przerwać funkcję.
Możesz schematycznie powiązać funkcję zdefiniowaną przez użytkownika w momencie jej tworzenia lub możesz zmienić później.
Zwykle można sprawdzić, czy UDF jest powiązany ze schematem w SQL Server, wyświetlając jego definicję. Zwykle możesz to zrobić za pomocą GUI, wybierając „Skrypt jako Utwórz” lub podobnie.
Możesz to również zrobić za pomocą T-SQL, wybierając definition kolumna sys.sql_modules widok katalogu systemowego.
Ale to zadziała tylko wtedy, gdy UDF nie jest zaszyfrowany.
Istnieje jednak inna kolumna w sys.sql_modules widok, który służy naszym celom, niezależnie od tego, czy UDF jest zaszyfrowany, czy nie:is_schema_bound
Przykład 1 – szyfrowany UDF
Oto przykład sprawdzenia, czy zaszyfrowana funkcja zdefiniowana przez użytkownika o nazwie udf_CatsByName_ITVF jest powiązany ze schematem, czy nie.
SELECT
definition,
is_schema_bound
FROM sys.sql_modules
WHERE object_id = OBJECT_ID('udf_CatsByName_ITVF');
Wynik:
+--------------+-------------------+ | definition | is_schema_bound | |--------------+-------------------| | NULL | 1 | +--------------+-------------------+
W takim przypadku UDF jest powiązany ze schematem.
Zauważ również, że definition kolumna zwraca NULL, ponieważ funkcja ma zastosowane szyfrowanie.
Przykład 2 – UDF bez szyfrowania
Gdyby szyfrowanie nie zostało zastosowane, moglibyśmy zobaczyć pełną definicję w tej kolumnie i zobaczylibyśmy argument WITH SCHEMABINDING w definicji.
Oto zapytanie ponownie, gdy funkcja nie jest zaszyfrowana.
SELECT
definition
FROM sys.sql_modules
WHERE object_id = OBJECT_ID('udf_CatsByName_ITVF');
Wynik:
+--------------+
| 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
);
|
+--------------+
Usunąłem is_schema_bound kolumny z zapytania, aby ułatwić czytanie.
Tak czy inaczej, is_schema_bound kolumna może być używana bez względu na to, czy UDF jest zaszyfrowany, czy nie.