with encryption 并非真正加密,而是删除源码,仅阻止 sp_helptext 查看,无法防 dba、备份还原或内存抓取;必须在 create/alter view 时显式完整声明,否则无效且不可追加。

WITH ENCRYPTION 不是加密,是删源码。它只拦得住 sp_helptext,防不住 DBA、备份还原、内存抓取,更拦不住能查数据的人。
CREATE VIEW 时必须显式写 WITH ENCRYPTION
SQL Server 不会记住“这个视图该加密”,它只认语法里有没有这一整块。漏写就等于没加,名字叫 vw_salary_formula_encrypted 也没用。
-
CREATE VIEW vw_orders WITH ENCRYPTION AS SELECT order_id, total FROM orders;✅ 生效 -
CREATE VIEW vw_orders AS SELECT order_id, total FROM orders;❌ 完全未加密,sys.sql_modules.definition可直接查到明文 - 没有
CREATE OR ALTER VIEW ... WITH ENCRYPTION这种简写——想加密,必须写出完整语句
ALTER VIEW 必须重写全部逻辑 + 再次声明 WITH ENCRYPTION
加密不是开关属性,不能“追加”或“开启”。已有视图想补上?ALTER VIEW 必须带完整 AS SELECT 部分和 WITH ENCRYPTION,否则自动解密。
针对嵌入式/固件项目的专家代码审查,采用双模型交叉审查(Claude + Codex via ACP),检测内存安全、中断危险、RTOS陷阱...
- 错误做法:
ALTER VIEW vw_orders AS SELECT order_id, total, status FROM orders;→ 原加密失效 - 正确做法:
ALTER VIEW vw_orders WITH ENCRYPTION AS SELECT order_id, total, status FROM orders; - SSMS 右键“修改”直接报错
Cannot modify encrypted objects.,图形界面生成的脚本不含原始逻辑,无法回填
加密后 sp_helptext 和 sys.sql_modules.definition 全部返回 NULL
这不是权限拦截,是 SQL Server 在 CREATE 或 ALTER 时就彻底丢弃了原始文本。没存明文,自然查不到。
-
EXEC sp_helptext 'vw_orders';→ 报错Cannot view the text for this object, because it is encrypted. -
SELECT definition FROM sys.sql_modules WHERE object_id = OBJECT_ID('vw_orders');→ 返回NULL - DBA 用 DAC 连接、还原备份、跑
DBCC命令,全都无效——没密钥,因为压根没加密,只是删了
真正该做的事:别把安全押在 WITH ENCRYPTION 上
它只管“能不能看定义”,不管“能不能查数据”。用户只要能 SELECT 视图,就能拿到结果,甚至通过执行计划、IO 统计、依赖关系反推逻辑。
- 核心计算逻辑尽量下推到应用层,SQL 层只做简单查询
- 若必须留复杂逻辑在 DB,优先用行级安全(
CREATE SECURITY POLICY)控制数据可见性,而非藏代码 - 加密不可逆,一旦执行就真没了。没备份原定义,改不了也看不着——这点最容易被忽略










