Обвързването със схема на обект, като например дефинирана от потребителя функция (UDF), се счита за добра практика, тъй като предотвратява извършването на промени във всички обекти, които препраща, които биха могли неволно да нарушат функцията.
Можете да обвържете със схема дефинирана от потребителя функция в момента, в който я създавате, или можете да промените по-късно.
Обикновено можете да проверите дали UDF е свързан със схема в SQL Server, като прегледате неговата дефиниция. Обикновено можете да направите това чрез графичния интерфейс, като изберете „Скрипт като създаване“ или подобно.
Можете също да го направите с T-SQL, като изберете definition
колона на sys.sql_modules
изглед на системен каталог.
Но това ще работи само ако UDF не е криптиран.
Има обаче друга колона в sys.sql_modules
изглед, който служи на нашата цел, независимо дали UDF е криптиран или не:is_schema_bound
Пример 1 – Криптиран UDF
Ето пример как да разберете дали криптирана дефинирана от потребителя функция, наречена udf_CatsByName_ITVF
е свързан със схемата или не.
SELECT дефиниция, is_schema_boundFROM sys.sql_modulesWHERE object_id =OBJECT_ID('udf_CatsByName_ITVF');
Резултат:
<пред>+--------------+-------------------+| определение | is_schema_bound ||--------------+------------------|| NULL | 1 |+--------------+-------------------+В този случай UDF е свързан със схема.
Също така забележете, че definition
колоната връща NULL, защото функцията е използвала криптиране.
Пример 2 – UDF без криптиране
Ако криптирането не беше приложено, бихме могли да видим пълната дефиниция в тази колона и щяхме да видим аргумента WITH SCHEMABINDING
в определението.
Ето отново заявката, когато функцията не е криптирана.
SELECT definitionFROM sys.sql_modulesWHERE object_id =OBJECT_ID('udf_CatsByName_ITVF');
Резултат:
+--------------+| определение ||--------------|| CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) ВРЪЩА ТАБЛИЦА СЪС SCHEMABINDINGASRETURN ( ИЗБЕРЕТЕ CatId, CatName, Phone FROM dbo.Cats WHERE CatName =@CatName ); |+--------------+
Премахнах is_schema_bound
колона от заявката, за да се улесни четенето.
Така или иначе, is_schema_bound
колоната може да се използва независимо дали UDF е криптиран или не.