脚本之oracle批量授权

本文介绍在Oracle数据库中实现批量授权的几种方式,包括通过PL/SQL动态SQL、使用循环及DBMS_SYS_SQL包来简化授权过程,适用于大量表的授权场景。

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

对于一些管理的脚本,我们平时要注意收集,遇到相关问题拿过来执行一下就OK,下面是一个批量授权的脚本分享给大家。

begin
for grant_sql in (
select 'grant select,insert,update,delete on scott.' || table_name || ' to SH'  exe_sql
 from all_tables t
where t.owner = 'SCOTT'
)
loop
  execute immediate grant_sql.exe_sql;
end loop;
end;


注释:


1、oracle初学者求教批量授权怎么执行的问题


select 'grant select on ' ||owner|| '.' ||table_name|| 'to user2;'  from dba_tables where owner='USER1';

在plsql中执行上述语句相当于只是执行了select 并没有执行授权,怎么样才能执行批量授权呢?即使得这条语句中执行grant命令,在user2用户下能查询user1下的表,不要一一授权,因为表很多,麻烦帮忙写下,谢谢各位大虾。


copy出来,要么写个循环,用动态SQL来做


BEGIN
  FOR lv_cur IN (
select 'grant select on ' ||owner|| '.' ||table_name|| 'to user2;' AS str from dba_tables where owner='USER1'
  ) LOOP
     EXECUTE IMMEDIATE lv_cur.str;
  END LOOP;
END;
/



2、

用DBMS_SYS_SQL包进行批量授权

Oracle9i之前,如果你想要把对象权限授予某些用户,那么你需要使用该对象属主或者使用具有该对象with grant option权限的用户。
  
  很多时候你可能需要进行批量授权,那么DBMS_SYS_SQL包可以为你提供简便.
  
  以下过程供参考:
  declare
  sqltext varchar2(200);
  c integer;
  begin
  for userlist in (select user_id,username from all_users where username not in ('SYS','SYSTEM','EYGLE')) loop
  for tablelist in (select owner,table_name from dba_tables where owner = userlist.username) loop
  sqltext := 'grant all on '||tablelist.owner||'.'||tablelist.table_name ||' to eygle with grant option';
  c := sys.dbms_sys_sql.open_cursor();
  sys.dbms_sys_sql.parse_as_user( c,sqltext,dbms_sql.native,userlist.user_id);
  sys.dbms_sys_sql.close_cursor(c);
  end loop;
  end loop;
  end;
  /
  
  以下是817中的执行过程,供参考:
  SQL> declare
   2 sqltext     varchar2(200);
   3 c        integer;
   4 begin
   5 for userlist in (select user_id,username from all_users where username not in ('SYS','SYSTEM','EYGLE')) loop
   6 for tablelist in (select owner,table_name from dba_tables where owner = userlist.username) loop
   7 sqltext := 'grant all on '||tablelist.owner||'.'||tablelist.table_name ||' to eygle with grant option';
   8 c := sys.dbms_sys_sql.open_cursor();
   9 sys.dbms_sys_sql.parse_as_user( c,sqltext,dbms_sql.native,userlist.user_id);
   10 sys.dbms_sys_sql.close_cursor(c);
   11 end loop;
   12 end loop;
   13 end;
   14 /
  
  PL/SQL procedure successfully completed.
  
  SQL>
  SQL> set pause on
  SQL> select owner,table_name,privilege,grantable from dba_tab_privs where grantee='EYGLE' and owner='SCOTT';
  
  OWNER             TABLE_NAME           PRIVILEGE GRA
  ------------------------------ ------------------------------ ---------- ---
  SCOTT             BONUS             ALTER   YES
  SCOTT             BONUS             DELETE   YES
  SCOTT             BONUS             INDEX   YES
  SCOTT             BONUS             INSERT   YES
  SCOTT             BONUS             SELECT   YES
  SCOTT             BONUS             UPDATE   YES
  SCOTT             BONUS             REFERENCES YES
  SCOTT             DEPT              ALTER   YES
  SCOTT             DEPT              DELETE   YES
  SCOTT             DEPT              INDEX   YES
  SCOTT             DEPT              INSERT   YES
  
  OWNER             TABLE_NAME           PRIVILEGE GRA
  ------------------------------ ------------------------------ ---------- ---
  SCOTT             DEPT              SELECT   YES
  SCOTT             DEPT              UPDATE   YES
  SCOTT             DEPT              REFERENCES YES
  SCOTT             EMP              ALTER   YES
  SCOTT             EMP              DELETE   YES
  SCOTT             EMP              INDEX   YES
  ....


参考:

批量执行授权 oracle       谷歌

oracle初学者求教批量授权怎么执

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值