with schemabinding 必须紧接 create view 和视图名之后,否则绑定失效;要求所有对象引用用两段式名称、select 列表不能用 *、依赖函数也须带 schemabinding,绑定后基表结构变更将被阻止。

WITH SCHEMABINDING 必须紧贴 CREATE VIEW 和视图名之后
漏写或位置错,就等于没绑定——SQL Server 不报语法错误,但后续建索引、防结构变更等功能全部失效。
常见错误写法:CREATE VIEW dbo.vw_Sales AS WITH SCHEMABINDING,这会被 SQL Server 当作普通视图处理;正确写法必须是:CREATE VIEW dbo.vw_Sales WITH SCHEMABINDING AS。
- 中间不能换行、不能插注释、不能有空行
- SSMS 图形界面新建视图时默认不勾选「绑定架构」,保存前务必切到「脚本」页手动补上
-
ALTER VIEW修改已有视图时,也得重写整条语句并保留WITH SCHEMABINDING,否则会悄悄解除绑定
所有表和函数引用必须用两段式名称(schema.object)
哪怕当前用户默认架构是 dbo,也不自动补前缀;系统视图如 sys.tables 也必须写全,三段式(master.dbo.sysdatabases)或单段式(Orders)全都不认。
-
FROM Orders→ 必须改成FROM dbo.Orders -
JOIN Customers c→ 必须写成JOIN dbo.Customers AS c -
SELECT * FROM sys.tables→ 必须写成SELECT * FROM sys.tables(不能省略sys.) - 跨库引用如
OtherDB.dbo.Table直接被拒绝,绑定失败
SELECT 列表不能用 *,且依赖的函数也必须带 SCHEMABINDING
* 被认为结果集不稳定,SQL Server 直接拒绑;而只要视图里调用了任意用户定义函数(哪怕只一次),那个函数本身也必须用 WITH SCHEMABINDING 创建,否则整个视图绑定失败。
-
SELECT *→ 改为显式列出每一列,如SELECT OrderID, CustomerID, OrderDate - 函数定义中漏掉
WITH SCHEMABINDING,例如CREATE FUNCTION dbo.ufn_GetStatus(...)→ 必须改成CREATE FUNCTION dbo.ufn_GetStatus(...) WITH SCHEMABINDING - 函数内部若再调其他对象,同样要遵守两段式命名 + 绑定要求
- 非确定性函数(如
GETDATE()、NEWID())即使绑定了,后续建索引也会失败
绑定成功后基表结构变更会被阻止
这是 SCHEMABINDING 的核心作用:防止误删列、改类型、删表导致视图失效。但这也意味着你不能再随意改动依赖对象——不是“不能改”,而是改之前必须先解绑或重建视图。
-
ALTER TABLE dbo.Orders DROP COLUMN OrderDate→ 报错:Cannot drop column 'OrderDate' because it is referenced by object 'vw_Sales' -
DROP TABLE dbo.Orders→ 同样报错,除非先DROP VIEW dbo.vw_Sales - 想修改列类型?先确认新类型是否与视图中表达式兼容,否则仍会失败
真正容易被忽略的是:绑定不是一劳永逸的防护罩,它只保护“当前定义下已明确依赖的对象”。如果视图逻辑里隐含了对统计信息、执行计划或 SET 选项的假设,那些地方依然可能出问题。










