Oracle授权A用户查询B用户的所有表

本文探讨了在Oracle数据库中,如何通过不同方式授权用户访问特定用户的表。介绍了直接授权、批量授权及使用角色和游标的授权策略,分析了各自的优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文地址:http://blog.itpub.net/29485627/viewspace-1252563/

需求:
新建的用户userA,要授权给他访问用户scott的所有表

有三种两方法:
1)
SQL> conn / as sysdba;
SQL> grant select any table on userA

这种方法的缺点是授予的权限过大,userA不仅可以访问scott下的所有表,也可以访问其他用户包括sys,system下的所有表。

2)
SQL> conn scott/tiger;
SQL> select 'GRANT SELECT ON' || table_name || 'to userA;'  from user_tables
得到的结果如下
grant select on emp to userA;
grant select on dept to userA;
grant select on bonus to userA;
grant select on loc to userA;

再把上面得到的结果逐一执行一遍:
SQL> grant select on emp to userA;
SQL> grant select on dept to userA;
SQL> grant select on bonus to userA;
SQL> grant select on loc to userA;

这种方法的缺点是要执行比较多的语句,如果有100个表,就得执行100个grant语句;
另外scott新建的表不在被授权的范围内,新建的表要想被userA访问,也得执行grant语句:
grant select on 新建的表 to userA;

(3)使用游标
先创建两个用户
SQL> create user test1 identified by oracle;
User created.

SQL> create user test2 identified by oracle;
User created.

授权
SQL> grant connect, resource to test1;
Grant succeeded.

SQL> grant connect, resource to test2;
Grant succeeded.

在test2下建立一个表作测试用
SQL> conn test2/oracle;
Connected.

SQL> create table t(id number);
Table created.

创建角色并用游标给角色授权
SQL> conn /as sysdba;
Connected.
 
SQL> create role select_all_test2_tab;
Role created

SQL> 
declare
  CURSOR c_tabname is select table_name from dba_tables where owner = 'TEST2';
  v_tabname dba_tables.table_name%TYPE;
  sqlstr    VARCHAR2(200);
    
begin
  open c_tabname;
  loop
    fetch c_tabname into v_tabname;
    exit when c_tabname%NOTFOUND;
    sqlstr := 'grant select on test2.' || v_tabname ||' to select_all_test2_tab';
    execute immediate sqlstr;
  end loop;
  close c_tabname;
end;
/

PL/SQL procedure successfully completed.

把角色授权给test1
SQL> grant select_all_test2_tab to test1;
Grant succeeded.

尝试用test1访问test2的表
SQL> conn test1/oracle;
Connected.

SQL> select * from test2.t;
no rows selected

在test2下新建表
SQL> conn test2/oracle;
Connected.
SQL> create table ta(id number);
Table created.

尝试用test1访问新建的表
SQL> conn test1/oracle;
Connected.
SQL> select * from test2.ta;
select * from test2.ta
                    *
ERROR at line 1:
ORA-00942: table or view does not exist

结论:与第二种方案相比,用这种方式不需逐一把test2下的表授权给test1访问,但test2新建的表无法被test1访问。

<think>我们正在处理一个Oracle数据库权限撤销的问题。用户想要撤销用户A对B的DELETE权限。根据引用[3]:实体权限是某种权限用户对其它用户或视图的存取权限。这里我们要撤销的是实体权限(DELETE权限)。在Oracle中,撤销权限使用REVOKE命令。具体步骤:1.确保我们是以有足够权限的用户(比如DBA或者B的所有者)登录。2.使用REVOKE命令撤销用户A对B的DELETE权限。命令格式:REVOKE[权限]ON[对象]FROM[用户/角色];因此,撤销用户A对B的DELETE权限的命令为:REVOKEDELETEONBFROMA;注意:-B必须存在,且当前用户有撤销这个权限的权限(比如是的所有者或者有GRANTANYOBJECTPRIVILEGE权限)。-如果之前是通过角色授予的权限,那么直接撤销角色的权限即可,但这里明确是撤销用户A的直接权限。根据引用[2]:撤销权限使用REVOKE命令,示例中展示了撤销权限后用户无法创建(系统权限),但这里我们处理的是实体权限。另外,引用[4]提到:撤消与DML操作有关的系统权限时,会有级联效果。但这里我们撤销的是实体权限(针对特定),不是系统权限(如DELETEANYTABLE),所以不会产生级联效果。不过,如果用户A已经创建了使用该权限的存储过程或视图,那么这些对象可能会失效,需要重新编译(如果存储过程或视图依赖于该权限)。因此,我们给出如下步骤:步骤:1.以具有撤销权限的用户(如B的所有者或DBA)登录数据库。2.执行撤销命令:REVOKEDELETEONBFROMA;如果B不在当前用户的模式下(即当前登录用户不是B的所有者),则需要在名前加上模式名,即:REVOKEDELETEON[模式名].BFROMA;例如,如果B属于用户SCOTT,则命令为:REVOKEDELETEONSCOTT.BFROMA;执行完毕后,用户A将不能再对B执行DELETE操作。注意:如果用户A是通过角色获得该权限的,则需要从该角色中撤销此权限,或者将用户A从该角色中移除。但根据问题描述,我们假设是直接授予的权限。如果用户A是通过角色获得的权限,我们可以通过查询数据字典视图来确认权限的授予方式。但问题没有提供这个信息,所以我们按直接授权处理。为了验证撤销是否成功,可以尝试以用户A登录并执行DELETE操作,应该会收到权限不足的错误。相关数据字典视图查询(可选):在撤销之前,可以查询用户A的实体权限,确认他是否拥有B的DELETE权限:SELECT*FROMUSER_TAB_PRIVSWHERETABLE_NAME='B'ANDGRANTEE='A';撤销后再次查询,应该没有该权限记录。因此,主要操作就是执行一条REVOKE命令。</think>### 如何撤销 Oracle 数据库中用户 A 对 B 的 DELETE 权限 在 Oracle 数据库中撤销用户权限需使用 `REVOKE` 命令,具体操作如下: #### 撤销步骤: 1. **以管理员身份登录** 使用具有 `GRANT ANY OBJECT PRIVILEGE` 权限的账户(如 `SYS`、`SYSTEM` 或 B 的所有者)连接数据库: ```sql CONNECT sys/password AS SYSDBA; -- 或用所有者账户登录 ``` 2. **执行撤销命令** 撤销用户 A 对 B 的 DELETE 权限: ```sql REVOKE DELETE ON B FROM A; ``` - **关键说明**: - `B` 需是名(若在其他模式,需用 `模式名.B`) - 撤销后即时生效,无需提交事务[^2][^3] 3. **验证撤销结果** 查询权限字典视图确认: ```sql SELECT * FROM DBA_TAB_PRIVS WHERE GRANTEE = 'A' AND TABLE_NAME = 'B' AND PRIVILEGE = 'DELETE'; ``` 结果应为空,示权限已撤销。 #### 注意事项: 1. **级联影响** - 若用户 A 有依赖此权限的存储过程/视图,撤销后这些对象将失效,需重新编译[^4] - 示例错误:`ORA-04063: view "A.VIEW1" has errors` 2. **权限来源** - 若权限通过角色间接授予,需撤销角色中的权限或移除用户的角色: ```sql REVOKE DELETE ON B FROM ROLE_X; -- 从角色撤销 -- 或 REVOKE ROLE_X FROM A; -- 移除用户角色 ``` 3. **权限范围** - 系统权限(如 `DELETE ANY TABLE`)需单独撤销: ```sql REVOKE DELETE ANY TABLE FROM A; ``` #### 操作示例: ```sql -- 步骤1:管理员登录 CONNECT system/oracle -- 步骤2:撤销删除权限 REVOKE DELETE ON hr.employees FROM scott; -- 步骤3:验证 SELECT PRIVILEGE FROM DBA_TAB_PRIVS WHERE OWNER='HR' AND TABLE_NAME='EMPLOYEES' AND GRANTEE='SCOTT'; -- 返回无DELETE权限记录 ``` > **关键区别**: > - 系统权限 `DELETE ANY TABLE` 允许删除所有 > - 实体权限 `DELETE ON B` 仅针对特定[^3] > 撤销时需明确目标权限类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值