with encryption 是sql server中用于隐藏视图定义的机制,它并非加密而是彻底丢弃明文,执行后无法通过sp_helptext或sys.sql_modules查询原始逻辑,且alter view必须显式重写完整语句并再次指定with encryption,否则原加密失效。

WITH ENCRYPTION 不是加密,是直接丢弃明文——加了就真没了,改不了也看不着,除非你手上有备份。
CREATE VIEW 时漏掉 WITH ENCRYPTION 就等于没加
SQL Server 不会记住“这个视图该加密”,它只认语法里有没有 WITH ENCRYPTION 这一整块。新建视图时少写这个词,哪怕名字叫 vw_sensitive_encrypted,定义照样裸奔。
-
CREATE VIEW vw_orders_summary WITH ENCRYPTION AS SELECT order_id, total FROM orders;✅ 生效 -
CREATE VIEW vw_orders_summary AS SELECT order_id, total FROM orders;❌ 完全未加密 - 没有
CREATE OR ALTER VIEW ... WITH ENCRYPTION这种简写;想加密,必须显式写出完整语句
ALTER VIEW 必须重写全部逻辑 + 再次声明 WITH ENCRYPTION
已有视图想补上加密?别指望 ALTER VIEW vw_xxx ADD ENCRYPTION——这种语法根本不存在。SQL Server 把 WITH ENCRYPTION 当作创建选项的一部分,不是开关属性。
- 错误做法:
ALTER VIEW vw_orders_summary AS SELECT order_id, total, status FROM orders;→ 原加密自动失效 - 正确做法:
ALTER VIEW vw_orders_summary WITH ENCRYPTION AS SELECT order_id, total, status FROM orders; - 如果记不清原逻辑又没备份,只能靠
SET STATISTICS XML ON看执行计划、查sys.dm_exec_describe_first_result_set推字段,非常被动
加密后 sp_helptext、sys.sql_modules.definition 全部返回 NULL
这不是权限拦截,是 SQL Server 在 CREATE 或 ALTER 时就彻底丢弃了原始文本。没存明文,自然查不到。
-
EXEC sp_helptext 'vw_orders_summary';→ 报错Cannot view the text for this object, because it is encrypted. -
SELECT definition FROM sys.sql_modules WHERE object_id = OBJECT_ID('vw_orders_summary');→ 返回NULL - DBA 用 DAC 连接、还原备份、跑 DBCC 命令,全都无效——没密钥,因为压根没加密,只是删了
SSMS 图形界面点“修改”直接报错,后续所有变更都得 DROP + RECREATE
加密后 SSMS 右键 → “修改”或双击打开设计器,一律弹出 Cannot modify encrypted objects.。图形界面生成的脚本不含原始逻辑,无法回填。
- 任何调整(哪怕只加个
AS customer_name别名)都必须人工重建:先DROP VIEW,再CREATE VIEW ... WITH ENCRYPTION AS ... - CI/CD 流程中若没把带
WITH ENCRYPTION的完整脚本纳入版本管理,一次误操作就永久丢失逻辑 - 真正难的不是加这行字,而是你得确保团队所有人知道:这个视图不能靠 SSMS 改,不能靠
sp_helptext查,不能靠依赖关系反推——它只活在你维护的那份 SQL 文件里
最常被忽略的一点:WITH ENCRYPTION 和 REVOKE VIEW DEFINITION 必须一起用。单加加密,高权限账号仍可通过 INFORMATION_SCHEMA.VIEWS 看到字段名和表达式结构;不收权限,加密形同虚设。











