如何阻止Oracle 11g用户查询其他Schema的表?权限配置咨询
嘿,咱们马上搞定这个跨Schema查询的权限问题!你的用户能访问其他Schema的表,大概率是因为你给的权限太宽泛,或者PUBLIC角色被授予了不该有的权限。下面一步步来锁定权限:
第一步:先收回危险的高权限
你给用户授予了DROP ANY TABLE这个超级权限——这玩意儿允许用户删除任何Schema的表,完全违背最小权限原则,而且也可能间接带来一些访问权限隐患。先把它撤掉:
REVOKE DROP ANY TABLE FROM [USER_NAME];
如果用户确实需要删除自己Schema的表,CREATE TABLE权限已经隐含了DROP TABLE(仅限自己的表),完全足够。
第二步:检查并清理PUBLIC角色的权限
Oracle里所有用户默认都会继承PUBLIC角色的权限,很多跨Schema访问的问题都出在这儿。先查一下PUBLIC有没有被授予SELECT ANY TABLE这类权限:
SELECT grantee, privilege FROM dba_sys_privs WHERE grantee = 'PUBLIC' AND privilege LIKE '%ANY TABLE%';
如果查询结果里有SELECT ANY TABLE,立刻撤销:
REVOKE SELECT ANY TABLE FROM PUBLIC;
⚠️ 注意:撤销前确认下有没有其他业务依赖这个权限(比如监控账号),但普通业务用户绝对不需要这个权限。
另外,也可以检查下PUBLIC是否有SELECT ANY DICTIONARY权限(这个是查数据字典的,虽然不直接访问业务表,但不需要的话也可以撤):
REVOKE SELECT ANY DICTIONARY FROM PUBLIC;
第三步:确认用户没有继承其他危险角色
看看你的用户有没有被授予DBA、RESOURCE之外的特殊角色,这些角色可能带了跨Schema权限:
SELECT granted_role FROM dba_role_privs WHERE grantee = '[USER_NAME]';
如果有不需要的角色(比如DBA),直接撤销:
REVOKE [ROLE_NAME] FROM [USER_NAME];
第四步:验证权限是否生效
用USER1登录数据库,执行SELECT * FROM USER2.table1;,正常应该返回类似ORA-01031: insufficient privileges(权限不足)或者ORA-00942: table or view does not exist的错误,这就说明权限已经锁死了。
如果还是能查询,那得检查是不是给USER1直接授予了特定表的权限:
SELECT grantee, owner, table_name, privilege FROM dba_tab_privs WHERE grantee = 'USER1' AND owner = 'USER2';
如果有结果,就撤销对应权限:
REVOKE SELECT ON USER2.table1 FROM USER1;
额外建议:遵循最小权限原则
以后创建用户时,只授予必要的权限,别一股脑给一堆高权限。比如这样写就足够:
create user [USER_NAME] identified by [PASSWORD] default tablespace [TABLESPACE_NAME] temporary tablespace TEMP; -- 仅授予用户操作自己Schema对象的权限 grant create session, create table, create synonym, create view, create sequence, create database link, create procedure, create trigger, create type, create materialized view to [USER_NAME]; -- 像create role、create public synonym这类权限,只有特定用户需要时再单独授予 alter user [USER_NAME] quota unlimited on [TABLESPACE_NAME];
内容的提问来源于stack exchange,提问作者Heedo Kim




