DBA 日常最繁琐的工作之一:批量授权。
典型场景:给报表用户授予 HR 下所有表只读权限。
在 Oracle 23ai 以前,你只能:

-- 对现有表逐个授权
GRANT SELECT ON HR.EMP TO RPT_USER;
GRANT SELECT ON HR.DEPT TO RPT_USER;
...
-- 新建表后,必须再次授权(DBA永无止境)

问题很明显:
表多了,授权脚本又长又易错;
新建表必须二次授权,否则报表直接报错;
用 SELECT ANY TABLE 又权限过大,不符合最小权限原则。
Oracle 23ai 正式推出模式级权限(Schema‑Level Privileges):
一条命令,授权整个 Schema(含未来新建对象),范围可控、权限最小、运维极简。

一、 核心语法:ON SCHEMA,一步到位

-- 给 RPT_USER 授予 HR 模式下所有表只读(含未来新建)
GRANT SELECT ANY TABLE ON SCHEMA HR TO RPT_USER;
-- 授予所有对象权限(查询/插入/更新/删除)
GRANT ALL PRIVILEGES ON SCHEMA HR TO DEV_USER;
-- 回收
REVOKE SELECT ANY TABLE ON SCHEMA HR FROM RPT_USER;

作用范围:当前 Schema 下所有已有 + 未来新建的同类型对象;
权限粒度:限定在指定 Schema 内,不像 SELECT ANY TABLE 是全局;
最小权限:只给 “该 Schema 的权限”,符合安全最佳实践。

二、 效果演示:新建表自动生效,无需 DBA 介入

1)初始授权

-- DBA
GRANT SELECT ANY TABLE ON SCHEMA A TO B;
-- 用户B
CONNECT B/xxx
SELECT COUNT(*) FROM A.T1; -- 正常
SELECT COUNT(*) FROM A.T2; -- 正常

2)用户 A 新建表

CONNECT A/xxx
CREATE TABLE T3 AS SELECT * FROM TAB;

3)用户 B 直接访问新表(无需再次授权)

CONNECT B/xxx
SELECT COUNT(*) FROM A.T3; -- 直接可用

真正做到:一次授权,永久生效(对该 Schema)。

三、支持的权限类型

常见模式级权限(可按业务组合):
SELECT ANY TABLE ON SCHEMA:只读报表账号首选;
INSERT ANY TABLE ON SCHEMA:数据同步 / ETL;
UPDATE ANY TABLE ON SCHEMA:运营维护;
DELETE ANY TABLE ON SCHEMA:数据清理;
ALTER ANY TABLE ON SCHEMA:开发 / 迁移;
ALL PRIVILEGES ON SCHEMA:开发 / 测试全权限。

四、视图与管理:怎么查已授予的 Schema 权限

-- 查看所有模式级权限(DBA)
SELECT * FROM DBA_SCHEMA_PRIVS;
-- 查看当前用户拥有的模式级权限
SELECT * FROM USER_SCHEMA_PRIVS;

视图:DBA_SCHEMA_PRIVS、ROLE_SCHEMA_PRIVS、USER_SCHEMA_PRIVS、SESSION_SCHEMA_PRIVS。

Related Posts