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.