SQL Server视图如何使用SCHEMABINDING

大瑶同学_1999

大瑶同学_1999

2026-08-08

426人浏览

原创

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

sql server视图如何使用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 选项的假设,那些地方依然可能出问题。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.11

4791

4

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

2026.09.30

20

10

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

2026.09.30

20

14

LLVM IR中间表示入门指南
LLVM IR中间表示入门指南

本专题整理LLVM IR的核心概念,包括中间表示作用、模块结构、函数、基本块、SSA形式、类型系统和常见语法,帮助新手理解LLVM编译流程中的关键层。

2026.09.30

20

12

PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

2026.09.30

20

26

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

2026.09.29

20

15

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

2026.09.23

220

15

Buffalo框架路由与请求处理实操指南
Buffalo框架路由与请求处理实操指南

本专题讲解Buffalo框架路由与请求处理机制,涵盖路由注册与分组、资源路由、Handler编写规范、Context上下文方法、参数绑定、中间件编写挂载、Session与Cookie读写、Flash消息及错误页面定制方法。

2026.09.23

140

15

Buffalo框架零基础入门教程
Buffalo框架零基础入门教程

本专题整理Buffalo框架入门内容,涵盖Go环境准备、buffalo CLI安装、新项目生成、目录结构说明、dev热加载启动、数据库连接配置与常见报错排查,帮助新手按约定优于配置的思路跑通第一个Buffalo框架应用。

2026.09.23

120

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.4万人学习