如何检查 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