如何使用SQL批量重新编译数据库中所有失效的视图?

老伟酱_2447

老伟酱_2447

2026-11-02

518人浏览

原创

SQL Server需用sp_refreshview刷新失效视图,PostgreSQL需DROP+CREATE重建,Oracle可用COMPILE_SCHEMA或ALTER VIEW COMPILE,MySQL无失效概念但需调整DEFINER和SQL SECURITY。

如何使用sql批量重新编译数据库中所有失效的视图?

SQL Server 中用 sp_refreshview 批量刷新失效视图

SQL Server 视图一旦所依赖的底层表结构变更(比如字段重命名、删列、改类型),视图本身不会自动更新,SELECT * 查询会直接报错 The view or function 'xxx' is not up to date。此时不能靠重建视图解决,必须显式调用 sp_refreshview 重新绑定元数据。

单个视图刷新很简单:EXEC sp_refreshview 'schema.view_name';。但成百上千个视图手动执行不现实,得靠系统视图动态生成语句:

SELECT 'EXEC sp_refreshview ''' + s.name + '.' + v.name + ''';'
FROM sys.views v
INNER JOIN sys.schemas s ON v.schema_id = s.schema_id
WHERE OBJECTPROPERTY(v.object_id, 'IsSchemaBound') = 0
  AND v.is_ms_shipped = 0;

注意两点:一是排除了 SCHEMABINDING 视图(这类视图依赖强,sp_refreshview 不适用,需手动调整);二是跳过系统自带视图,避免误操作。

PostgreSQL 中需手动 DROP + CREATE 替代“刷新”

PostgreSQL 没有类似 sp_refreshview 的内置机制。视图失效通常发生在基础表被 ALTER TABLE ... RENAME COLUMN 或 DROP COLUMN 后,查询时报错 column xxx does not exist。它不会“静默失效”,而是在执行时才暴露问题。

没有通用刷新命令,只能重建。安全做法是先导出定义,再重创建:

  • 查出所有用户视图定义:SELECT schemaname, viewname, definition FROM pg_views WHERE schemaname NOT IN ('pg_catalog', 'information_schema');
  • 对每个视图,用 pg_get_viewdef('schema.view') 获取完整 SQL,检查是否含已删字段
  • 确认无误后,用 DROP VIEW IF EXISTS schema.view; CREATE VIEW ... 重建

别试图用 CREATE OR REPLACE VIEW 直接覆盖——如果原视图引用了已不存在的列,这条语句本身就会失败。

Oracle 中用 DBMS_UTILITY.COMPILE_SCHEMA 或逐个调用 ALTER VIEW COMPILE

Oracle 视图失效后状态为 INVALID,可通过 SELECT object_name, status FROM all_objects WHERE object_type = 'VIEW' AND status = 'INVALID'; 查到。它不像 SQL Server 那样运行时报错,而是编译阶段就卡住。

DrugBank 数据库
DrugBank 数据库

访问并分析来自 DrugBank 数据库的全面药物信息,包括药物属性、相互作用、靶点、通路、化学结构和药理学数据。用于药物数据、药物发现研究、药理学研究、药物-

下载

批量编译有两个路径:

  • 最省事:用 DBMS_UTILITY.COMPILE_SCHEMA(schema => 'YOUR_SCHEMA', compile_all => FALSE); —— 参数 compile_all => FALSE 表示只编译无效对象,不会重编译所有有效视图,更安全
  • 更可控:拼出 ALTER VIEW schema.view_name COMPILE; 语句批量执行,适合跨多个 schema 或需要日志记录的场景

注意:Oracle 对大小写敏感,如果视图名含双引号(比如 "MyView"),拼接语句时必须保留引号,否则报 ORA-00942: table or view does not exist。

MySQL 8.0+ 视图没有“失效”概念,但要注意 DEFINER 权限和 SQL SECURITY 变更

MySQL 视图本身不存储元数据绑定,查询时实时解析底层表。所以严格来说它没有“失效视图”一说。但两类情况会导致运行时报错:

  • DEFINER 用户被删或权限不足,执行时报 Access denied for user 'xxx'@'%' (using password: NO)
  • 视图定义里用了 SQL SECURITY DEFINER,但当前用户没权限访问底层表

批量修复方式不是“刷新”,而是统一调整视图属性:

SELECT CONCAT('ALTER DEFINER=`root`@`localhost` SQL SECURITY INVOKER VIEW `', table_schema, '`.`', table_name, '` AS ', view_definition, ';')
FROM information_schema.VIEWS
WHERE table_schema NOT IN ('mysql', 'information_schema', 'performance_schema', 'sys');

生成的语句把所有视图的 DEFINER 改为可信账号,并切换为 SQL SECURITY INVOKER,让权限由调用者决定,避免隐式权限失败。

真正容易被忽略的是:SQL Server 的 sp_refreshview 不会修复因函数/存储过程变更导致的视图失效;Oracle 的 COMPILE_SCHEMA 不处理依赖于同义词(synonym)的视图;而 MySQL 的视图即使能跑通,也可能因底层表字符集变更引发隐式转换警告——这些都得单独排查。

相关文章

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

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

下载

相关标签:

数据库

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

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

4703

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

971

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1229

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

6701

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

3423

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

6680

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

9241

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1250

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1092

5

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Revel 官方 app.conf 文档
Revel 官方 app.conf 文档

共0课时 | 0人学习

Buffalo框架新项目生成指南
Buffalo框架新项目生成指南

共0课时 | 0人学习

Buffalo框架官方文档
Buffalo框架官方文档

共0课时 | 0人学习