执行 SELECT ... AS OF TIMESTAMP 查询其他 schema 表需显式授予 FLASHBACK 对象权限,仅 SELECT 权限不足;DBMS_FLASHBACK.ENABLE_AT_TIME 需 EXECUTE 权限且不替代表级 SELECT 或 FLASHBACK 权限;FLASHBACK 权限不可通过角色间接授予,必须直接授予用户。
用户能执行 select ... as of timestamp 查询其他 schema 的表,不是靠 select 权限本身决定的,而是由显式授予的 flashback 对象权限控制——没这个权限,哪怕有 select,也会报 ora-01031: insufficient privileges。
闪回查询跨 schema 时,FLASHBACK 权限是独立于 SELECT 的强制要求。只给 SELECT 不够,必须显式加授:
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 是 scott 的同义词拥有者或有 SELECT ANY TABLE,也不能替代该对象级授权用 DBMS_FLASHBACK 包切换会话时间点(比如回退 10 分钟),和 AS OF 语法是两条路径,权限要求不同:
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 —— FLASHBACK 权限在这里不生效,它只管包调用权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 查询仍失败,且错误提示不会明确指出是权限路径问题。