在实际的数据库运维中,闪回查询是一个高频功能,但权限配置的坑往往比想象中多。不少人以为只要给了SELECT权限,就能随便查其他 schema 的历史快照,结果一到正式环境就跑出 ORA-01031。这里的关键点在于:SELECT ... AS OF TIMESTAMP 跨 schema 查表,真正控
SELECT权限,就能随便查其他 schema 的历史快照,结果一到正式环境就跑出 ORA-01031。这里的关键点在于:SELECT ... AS OF TIMESTAMP 跨 schema 查表,真正控制权限的不是 SELECT,而是显式授予的 FLASHBACK 对象权限——没它,哪怕SELECT权限再全,也照样报错。

先记住一个原则:跨 schema 闪回查询时,FLASHBACK 权限与 SELECT 权限是并列且独立的,谁也不替代谁。想要让用户 dev_user 查到 scott.emp 的历史数据,正确的授权姿势是:
长期稳定更新的攒劲资源: >>>点此立即查看<<<
GRANT SELECT, FLASHBACK ON scott.emp TO dev_user; —— 两条权限一次给全,这才是标准做法。GRANT SELECT ON scott.emp TO dev_user;,后面执行 SELECT * FROM scott.emp AS OF TIMESTAMP SYSDATE-1/1440,一定会碰一鼻子灰。FLASHBACK 权限不向上继承。即使 dev_user 拥有 SELECT ANY TABLE 或者正好是 scott 的同义词拥有者,这些都不能替代对象级的 FLASHBACK 授权。缺就是缺。除了 AS OF 语法,还有一条路径是通过 DBMS_FLASHBACK 包在会话级别切换时间点。这两条路权限要求完全不同,千万别混:
DBMS_FLASHBACK.ENABLE_AT_TIME,先得给用户授予包的 EXECUTE 权限:GRANT EXECUTE ON sys.DBMS_FLASHBACK TO dev_user;。EXEC DBMS_FLASHBACK.ENABLE_AT_TIME(SYSDATE - 1/24); SELECT * FROM emp;。但注意:这个 emp 必须是当前用户 own 的表,或者已经单独给过 SELECT 权限。包本身的 EXECUTE 权限只管调用包,不管表级访问。EXECUTE 就能查别人的表,结果报告 ORA-00942: table or view does not exist。真相是缺少 SELECT 权限,跟包权限无关。还有一个容易被带偏的认知:闪回查询(AS OF)读的是 undo 数据,和回收站没有一毛钱关系;回收站只跟 FLASHBACK DROP 有关。分清楚这俩,能省不少排查时间:
ALTER SYSTEM SET RECYCLEBIN = OFF;),AS OF 查询依然正常工作,毫无影响。FLASHBACK TABLE scott.emp TO BEFORE DROP 恢复误删的表,那就必须开启回收站,并且要拥有 FLASHBACK ANY TABLE 或对象级的 FLASHBACK 权限。AS OF 查非本 schema 表时,只检查目标表上的 FLASHBACK 权限;而 FLASHBACK TABLE ... TO BEFORE DROP 则检查当前用户对目标 schema 的系统权限或对象权限,路径完全不同。还有一个极易踩的坑:FLASHBACK 权限不能通过角色间接授予。也就是说,你不能先把 FLASHBACK 授权给一个角色,再把角色授予用户——这样 AS OF 查询照样失败,而且错误提示一般不会告诉你“权限传递路径不对”。必须直接 GRANT FLASHBACK ON ... TO user,没有捷径。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述