不能。create any table权限仅允许用户在自己schema下建表并绕过表空间配额检查,但无法在他人schema中建表,否则触发ora-01031权限错误;跨schema建表必须由目标schema owner、dba切换current_schema或授予目标用户create table权限及配额。
create any table权限到底能不能让普通用户在别人schema里建表
不能。哪怕你被授予了 create any table,也不能直接用 create table other_user.t (...) 在别人 schema 下建表——oracle 会报 ora-01031(权限不足),而不是 ora-00942。这个权限只允许你在**自己的 schema**下建表,同时绕过“必须有该 schema 表空间配额”的检查,但它不赋予跨 schema 写入能力。
为什么ORA-01031会出现在跨Schema建表时
错误本质是系统权限校验失败,不是对象不存在。Oracle 对 CREATE TABLE schema.table 这种写法的语义定义很明确:只有 schema 本人、DBA 或拥有 IMP_FULL_DATABASE 等极少数高危角色的用户才能执行。即使你有 CREATE ANY TABLE,只要不是目标 Schema 的 owner,就卡在这一步。
- 验证方式:用目标用户登录后执行
SELECT * FROM SESSION_PRIVS;,确认CREATE ANY TABLE在列表中;再换当前用户执行CREATE TABLE other_user.t (id INT);,复现 ORA-01031 - 注意:
CREATE ANY TABLE允许你建CREATE TABLE t(无 schema 前缀),但 Oracle 会强制落到你自己的 Schema 下,且仍需你对该 Schema 所属表空间有配额 - 别混淆
CREATE ANY TABLE和INSERT ANY TABLE:后者管写数据,前者只管建结构,且严格绑定 owner 身份
真想在别人Schema建表,只有这三种合法路径
生产环境几乎只推荐第三种,前两种属于临时或特殊场景。
- 由目标 Schema owner 自己执行建表语句(最安全,所有权清晰)
- DBA 用
ALTER SESSION SET CURRENT_SCHEMA = other_user;切换后再建——但建出的对象 owner 仍是other_user,且该 session 必须有CREATE ANY TABLE或对应 Schema 的CREATE TABLE权限 - 给目标用户授
CREATE TABLE权限 + 表空间配额,让他自己连过去建(推荐)。例如:DBA 执行GRANT CREATE TABLE TO other_user;和ALTER USER other_user QUOTA 50M ON users;
为什么别滥用CREATE ANY TABLE来“绕开”Schema隔离
它看似强大,实则破坏最小权限原则,且掩盖真正问题。
- 它无法解决配额问题:你用它在自己 Schema 建大表,仍可能因没配额而失败(ORA-01950)
- 审计困难:DBA 查
DBA_SYS_PRIVS只能看到“有这权”,看不出谁在哪建了什么表 - 权限回收颗粒度为零:一旦撤销,所有依赖它的应用全挂,没法只禁掉某几张表
- 和
UNLIMITED TABLESPACE一样,多数企业安全策略明文禁止授予非 DBA 账号
真正需要跨 Schema 操作的场景,应该走 owner 授权 + 同义词 + 视图封装,而不是靠系统权限硬闯。Schema 隔离不是障碍,是设计约束。











