You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何阻止Oracle 11g用户查询其他Schema的表?权限配置咨询

解决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;

第三步:确认用户没有继承其他危险角色

看看你的用户有没有被授予DBARESOURCE之外的特殊角色,这些角色可能带了跨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

火山引擎 最新活动