sql server 中给视图加描述的唯一可靠方式是使用 sp_addextendedproperty,存储于 sys.extended_properties 系统表,且必须指定架构名;postgresql 用 comment on view(需带 schema);mysql 仅支持 create view 时通过 comment 属性定义。

SQL Server 里怎么给视图加描述,sp_addextendedproperty 是唯一靠谱方式
SQL Server 不支持 COMMENT ON VIEW 这种 PostgreSQL 风格的语法,想存描述只能靠扩展属性。系统表 sys.extended_properties 是唯一被官方支持、且能被 SSMS 图形界面识别的注释存储位置。
常见错误是直接改 sys.views 或试图用 ALTER VIEW ... WITH (DESCRIPTION = 'xxx') —— 这俩都不存在,执行就报 Incorrect syntax near 或提示对象不可更新。
- 必须用
sp_addextendedproperty,且前三个参数固定为'MS_Description'、描述文本、'SCHEMA'、架构名、'VIEW'、视图名 - 如果视图在
dbo下,不能省略@level0name = 'dbo',否则注释会挂到数据库级 - 执行前最好先查一下是否已存在:
SELECT * FROM fn_listextendedproperty(NULL, 'SCHEMA', 'dbo', 'VIEW', 'my_view', NULL, NULL)
PostgreSQL 视图注释直接用 COMMENT ON VIEW,但要注意对象路径写全
PostgreSQL 支持标准 SQL 的 COMMENT 语法,干净利落。但容易踩坑的是:如果视图不在 public schema,必须显式写出 schema 名,否则注释会创建失败或挂错地方。
典型错误现象是执行完没报错,但在 \d+ my_view 里看不到描述——八成是 schema 没指定,系统默认去找 public.my_view。
- 正确写法:
COMMENT ON VIEW sales.summary_report IS '按月汇总销售额与退货率'; - 带 schema 的写法:
COMMENT ON VIEW analytics.active_users IS '最近30天登录用户去重计数'; - 删注释用
COMMENT ON VIEW xxx IS NULL;,不是DROP COMMENT(这语法不存在)
MySQL 8.0+ 给视图加描述只能靠 COMMENT 字段,但仅限 CREATE 时指定
MySQL 的视图本身不支持运行时添加注释,ALTER VIEW 语句没有 COMMENT 子句。唯一能留下说明的方式,是在 CREATE VIEW 里用 COMMENT 属性——而且只接受字符串字面量,不能拼接变量或函数。
这意味着:上线后发现描述写错了?没法热修复,必须重建视图。重建还可能触发权限重置或依赖失效,线上慎用。
- 建视图时加上:
CREATE VIEW user_summary COMMENT '含注册时间、最后登录、设备类型聚合' AS SELECT ...; -
SHOW CREATE VIEW user_summary能看到这个 comment,但INFORMATION_SCHEMA.VIEWS表里没有单独字段存它,得从VIEW_DEFINITION里自己解析 - 别指望
ALTER VIEW user_summary COMMENT 'new'—— 语法错误,MySQL 直接拒绝
跨数据库迁移时,注释几乎必然丢失,元数据导出要单独处理
不同数据库存注释的位置和机制完全不同:SQL Server 塞进系统存储过程,PostgreSQL 写进 pg_description,MySQL 只埋在 CREATE 语句里。任何通用导出工具(比如 mysqldump、pg_dump --schema-only)默认都不包含这些描述信息。
如果你用 Flyway 或 Liquibase 管理变更,COMMENT 类操作必须手动写成独立的 SQL 文件并加入 changelog——它不会从 DDL 自动提取。
- SQL Server 迁出注释:需额外查询
sys.extended_properties并生成一批sp_addextendedproperty脚本 - PostgreSQL 迁出注释:用
pg_dump --schema-only --no-owner --no-privileges仍不够,得配合pg_dump -s -t pg_description(不推荐,太底层)或用pg_dump --inserts导出带注释的 INSERT - MySQL 注释一旦建好就“固化”在
CREATE VIEW里,dump 出来有,但重建时若没加IF NOT EXISTS,重复执行会报错
注释不是装饰,是生产环境排查逻辑的线索。但它不像主键那样强制校验,一不留神就断连——尤其是当 DBA 换人、文档没同步、又没人定期核对 sys.extended_properties 和代码注释是否一致的时候。










