如何检查 T-SQL UDF 是否绑定了架构(即使它已加密)
架构绑定对象(如用户定义函数 (UDF))被认为是一种很好的做法,因为它可以防止对它引用的任何对象所做的更改,这些更改可能会无意中破坏函数。
您可以在创建用户定义函数时对其进行架构绑定,也可以在以后进行更改。
通常,您可以通过查看 UDF 的定义来检查 UDF 是否在 SQL Server 中绑定了架构。您通常可以通过 GUI 选择“脚本作为创建”或类似方式执行此操作。
还可以使用 T-SQL 通过选择系统目录视图的列来执行此操作。definition``sys.sql_modules
但这只有在 UDF 未加密的情况下才有效。
但是,无论 UDF 是否加密,视图中还有另一列可以满足我们的目的:sys.sql_modules``is_schema_bound
示例 1 – 加密的 UDF
下面是一个示例,用于确定调用的加密用户定义函数是否绑定架构。udf_CatsByName_ITVF
SELECT definition, is_schema_bound FROM sys.sql_modules WHERE object_id = OBJECT_ID(‘udf_CatsByName_ITVF’);
输出:
+--------------+-------------------+
| definition | is_schema_bound |
|--------------+-------------------|
| NULL | 1 |
+--------------+-------------------+在这个示例中,UDF 是架构绑定的。
另请注意,该列返回 NULL,因为该函数已应用加密。definition
示例 2 – 不加密的 UDF
如果没有应用加密,我们可能会在该列中看到完整的定义,并且我们将看到定义中的参数。WITH SCHEMABINDING
这是函数未加密时的查询。
SELECT definition FROM sys.sql_modules WHERE object_id = OBJECT_ID(‘udf_CatsByName_ITVF’);
输出:
+--------------+
| 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
); |
+————–+
我已从查询中删除了该列,以使其更易于阅读。is_schema_bound
无论哪种方式,无论 UDF 是否加密,都可以使用该列。is_schema_bound