了解 SQL 依赖关系

新建日期: 2005 年 12 月 5 日

SQL 依赖关系是在 SQL 表达式中使用的按名称引用,可使一个对象依赖于另一个对象。通过查询 sys.sql_dependencies 目录视图,您可以查找所有的按名称依赖关系。对于 sys.sql_dependencies 中的每行,被引用实体 (referenced_major_id) 按名称在引用对象的持久化 SQL 表达式中显示。

下图阐释了 SQL 依赖关系的示例。

SQL 依赖关系说明

在该图中,有两个对象:过程 X 和过程 Y。过程 X 包含一个按名称引用过程 Y 的 SQL 表达式。过程 X 称为引用对象或依赖对象,过程 Y 称为被引用对象或独立对象。由于过程 X 依赖于过程 Y,因此当过程 Y 不存在时,过程 X 将失败,并出现运行时错误。但是,当过程 X 不存在时,过程 Y 也不会失败。

下面的示例说明存储过程 X 如何依赖于存储过程 Y

USE tempdb
GO
CREATE PROCEDURE Y AS
SELECT * FROM sys.objects
GO
CREATE PROCEDURE X as
    EXEC Y
GO

若要查看 XY 的依赖关系,请运行以下查询。

SELECT * 
FROM  sys.sql_dependencies 
WHERE object_id = object_id('X')
   AND   referenced_major_id = object_id('Y')
   AND   referenced_minor_id = 0
   AND   class = 0;
GO

如果删除过程 X,则仍可以运行过程 Y。过程 Y 独立于过程 X。相反,如果删除过程 Y 并尝试运行过程 X,则 SQL Server 将返回运行时错误。过程 X 依赖于过程 Y

删除过程 Y 之后,sys.sql_dependencies 目录视图中过程 X 所在的行也会被删除。若要查看此行为,请运行以下代码。

USE tempdb;
GO
DROP PROCEDURE Y;
GO
SELECT * 
FROM  sys.sql_dependencies 
WHERE object_id = object_id('X')
   AND   referenced_major_id = object_id('Y')
   AND   referenced_minor_id = 0
   AND   class = 0;
GO

您可以使用 WITH SCHEMABINDING 子句执行依赖关系维护。如果将视图绑定到架构,则不能采用中断依赖关系的方式修改或删除被引用表或列。同样,如果将函数绑定到架构,也不能采用中断函数依赖关系的方式修改或删除被引用对象和列。有关架构绑定的详细信息,请参阅创建用户定义函数(数据库引擎)设计和实现视图

ms345449.note(zh-cn,SQL.90).gif注意:
SQL Server 2005 不支持绑定到架构的存储过程或触发器。

SQL 依赖关系示例

下表列出了一些在引用对象和被引用对象之间可能存在的 SQL 依赖关系示例。

引用对象的类型

目录视图定义列中的 SQL 表达式

被引用实体示例

过程、函数、视图、触发器

sys.sql_modules

ms345449.note(zh-cn,SQL.90).gif注意:

有关服务器级触发器,请参阅 sys.server_sql_modules

表、过程、类型

计算列

sys.computed_columns

函数、类型、其他列

DEFAULT 定义

sys.default_constraints

函数

CHECK 约束

sys.check_constraints

函数、分区函数

带编号的过程

sys.numbered_procedure

表、过程、类型

绑定到架构的函数

sys.sql_modules

XML 架构集合

非 SQL 依赖关系示例

并非所有存在于对象之间的依赖关系都是 SQL 依赖关系。如果某个对象没有按名称引用另一个对象的 SQL 表达式,则这两个对象之间不存在 SQL 依赖关系。下表列出了一些非 SQL 依赖关系的示例。

引用对象的类型 依赖于 说明

表与其列之间的依赖关系是隐式的。在系统目录中,此关系以外键 sys.columns.object_id 表示。

列的 DEFAULT 定义,例如:

CREATE TABLE myTable AS

(ColA int CONSTRAINT Const1 DEFAULT 1)

列。在此示例中为 ColA

在 DEFAULT 定义和列之间不存在 SQL 依赖关系,因为默认的 Const1 并不按名称引用列 ColA。相反,存在 sys.columns.default_object_id 对 DEFAULT 定义对象的外键引用。

请参阅

其他资源

sys.sql_dependencies (Transact-SQL)
sys.sysdepends (Transact-SQL)
sp_depends (Transact-SQL)

帮助和信息

获取 SQL Server 2005 帮助