了解 SQL 依赖关系
新建日期: 2005 年 12 月 5 日
SQL 依赖关系是在 SQL 表达式中使用的按名称引用,可使一个对象依赖于另一个对象。通过查询 sys.sql_dependencies 目录视图,您可以查找所有的按名称依赖关系。对于 sys.sql_dependencies 中的每行,被引用实体 (referenced_major_id) 按名称在引用对象的持久化 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
若要查看 X
对 Y
的依赖关系,请运行以下查询。
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 子句执行依赖关系维护。如果将视图绑定到架构,则不能采用中断依赖关系的方式修改或删除被引用表或列。同样,如果将函数绑定到架构,也不能采用中断函数依赖关系的方式修改或删除被引用对象和列。有关架构绑定的详细信息,请参阅创建用户定义函数(数据库引擎)和设计和实现视图。
注意: |
---|
SQL Server 2005 不支持绑定到架构的存储过程或触发器。 |
SQL 依赖关系示例
下表列出了一些在引用对象和被引用对象之间可能存在的 SQL 依赖关系示例。
引用对象的类型
目录视图定义列中的 SQL 表达式
被引用实体示例
过程、函数、视图、触发器
sys.sql_modules
注意:
有关服务器级触发器,请参阅 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 定义,例如:
|
列。在此示例中为 |
在 DEFAULT 定义和列之间不存在 SQL 依赖关系,因为默认的 |
请参阅
其他资源
sys.sql_dependencies (Transact-SQL)
sys.sysdepends (Transact-SQL)
sp_depends (Transact-SQL)