schemabinding 是建立视图与被引用对象间的强依赖关系,防止修改、重命名或删除被引用的表或列;其本质是元数据依赖检查,非运行时锁,依赖记录在 sys.sql_modules 等系统视图中。

SCHEMABINDING 不是用来“强制锁定底层表结构”的,它只是让视图和所引用的对象之间建立强依赖关系——一旦绑定成功,你就不能随意修改、重命名或删除被引用的表列、表本身,否则会报错。
真正起作用的是 SQL Server 的元数据依赖检查机制,而不是某种运行时锁。你执行 CREATE VIEW ... WITH SCHEMABINDING 后,系统会在 sys.sql_modules 和 sys.dm_exec_describe_first_result_set 等地方记录依赖关系,并在你试图变更底层对象时提前拦截。
为什么 ALTER TABLE 会失败?
当你对一个被架构绑定视图引用的表执行 ALTER TABLE ... DROP COLUMN 或 ALTER TABLE ... ALTER COLUMN(类型/长度变化)时,SQL Server 会检查所有依赖该列的对象。如果存在 SCHEMABINDING 视图,就会直接拒绝操作,并抛出错误:Msg 5074, Level 16, State 1: The object 'xxx' is dependent on column 'yyy'.
创建架构绑定视图的硬性前提
要成功使用 SCHEMABINDING,必须满足以下全部条件:
- 视图中所有对象引用都必须用两段式名称(
schema.object),比如dbo.Customers,不能只写Customers - 引用的表、函数、其他视图也必须存在于同一数据库中
- 不能引用临时表、表变量、TVF 返回的列(除非是内联 TVF 且显式声明了返回列)
- 视图定义中不能含
SELECT *、ORDER BY(除非配合TOP或OFFSET/FETCH)、INTO子句
如何解除这种“锁定”?
没有“解锁”命令,只有两种路径:
- 先
DROP VIEW或ALTER VIEW去掉WITH SCHEMABINDING,再改表;改完后若还需绑定,再重新加回来 - 用
sp_refreshsqlmodule刷新视图定义(仅适用于列名未变但底层类型已改、且视图仍语法合法的情况)
注意:sp_refreshsqlmodule 不会绕过依赖检查,它只更新视图的元数据缓存,前提是视图当前定义依然能编译通过。
它不阻止哪些操作?
SCHEMABINDING 是静态依赖检查,不是运行时保护:
- 不影响
INSERT/UPDATE/DELETE对表的数据修改 - 不阻止
TRUNCATE TABLE(只要没被视图以外的其他机制(如外键、触发器)阻止) - 不阻止添加新列(
ADD COLUMN),因为视图里没引用它 - 不阻止重命名架构(
ALTER SCHEMA),但会破坏两段式引用,导致视图失效
真正的结构防护靠的是开发流程管控,而不是这个选项本身。










