Oracle 19c ADG物理备库不支持SELECT ANY TABLE,因READ ONLY WITH APPLY模式禁止隐式字典访问,触发ORA-01031;需在备库显式逐表授权或建角色+同义词实现只读访问。

不能在Oracle 19c ADG物理备库上“授权全库查询”——SELECT ANY TABLE必然失败,报ORA-01031: insufficient privileges,这不是权限没刷,是内核级硬限制。
为什么SELECT ANY TABLE在ADG备库一定报错
ADG物理备库运行在READ ONLY WITH APPLY模式,禁止任何隐式字典访问。而SELECT ANY TABLE的权限校验过程会尝试读取obj$、tab$等底层字典表,直接触发只读保护。即使语句执行成功,后续任意SELECT都会崩。
-
READ ANY TABLE根本不存在——语法直接报ORA-01931: cannot grant read any table -
SELECT ANY DICTIONARY同样无效,备库不开放“任意读字典”通道 - 主库授予的系统级权限,不会同步到备库;必须在目标备库实例(或目标PDB)中显式操作
在备库上创建只读用户并覆盖整个schema的最小可行步骤
所有操作必须在目标备库(不是主库)的SQL*Plus或SQL Developer中执行,且需有SYSDBA或具备GRANT ANY OBJECT PRIVILEGE的权限。
- 确认用户要访问的schema真实存在:
SELECT owner, table_name FROM dba_tables WHERE owner = 'CMSPROD' AND ROWNUM = 1 - 创建用户并赋予连接能力:
CREATE USER cmsreadonly IDENTIFIED BY "xxx" DEFAULT TABLESPACE users+GRANT CREATE SESSION TO cmsreadonly - 逐表授权(schema名必须大写、不可省略):
GRANT SELECT ON CMSPROD.PORTAL_USER_PROFILE TO cmsreadonly - 批量生成授权语句(在备库执行):
SELECT 'GRANT SELECT ON CMSPROD.' || table_name || ' TO cmsreadonly;' FROM dba_tables WHERE owner = 'CMSPROD' - 临时表空间可选但建议配:
ALTER USER cmsreadonly QUOTA UNLIMITED ON temp
用角色封装权限比直授用户更安全,但要注意CDB/PDB陷阱
直接对用户授一堆GRANT SELECT ON极难维护,漏一张表就查不到数据;角色是合理抽象层,但多租户下必须按PDB独立处理。
- 先切换到目标PDB:
ALTER SESSION SET CONTAINER = ORA19CPDB - 建角色:
CREATE ROLE app_readonly - 把表权限授给角色(不是用户):
GRANT SELECT ON CMSPROD.PORTAL_USER_PROFILE TO app_readonly - 再把角色授给用户:
GRANT app_readonly TO cmsreadonly -
CREATE SESSION必须单独授予用户——角色本身不带登录能力 - CDB环境下,每个需访问的PDB都得重复执行建角色+授权,角色不会跨PDB继承
同义词和视图需要单独处理,否则用户查不到裸表名
即使已授SELECT ON SCHEMA.TABLE,用户仍需用SCHEMA.TABLE全限定名查询。若想让SELECT * FROM PORTAL_USER_PROFILE生效,必须建同义词。
- 在只读用户下建私有同义词(推荐):
CREATE SYNONYM PORTAL_USER_PROFILE FOR CMSPROD.PORTAL_USER_PROFILE - 或由DBA在
CMSPROD下建公有同义词:CREATE PUBLIC SYNONYM PORTAL_USER_PROFILE FOR CMSPROD.PORTAL_USER_PROFILE - 视图也要单独授
SELECT:GRANT SELECT ON CMSPROD.VW_USER_SUMMARY TO cmsreadonly - 物化视图日志、序列等非表对象,不默认包含在
dba_tables里,需额外识别并授权
最易被忽略的一点:ADG备库上的授权变更不会反向同步到主库,也不影响主库的任何行为;但一旦发生主备切换,原备库变主库后,这些只读用户权限依然有效——所以授权语句本身要可重入、可审计,别依赖“反正切过去就没了”这种侥幸心理。


















