Oracle
Allen 2023-04-25 17:57:58 9983 0 0 0 0
Oracle基础,赋单张表的select权限的SQL是grantselectonuser1.table1touser2要找出user1下的所有表赋权限,那表名肯定不是写死的.而是通过SQL动态获取的要通过SQL获取us…

赋单张表的select权限的SQL是 grant select on user1.table1 to user2

要找出user1下的所有表赋权限,那表名肯定不是写死的.而是通过SQL动态获取的

要通过SQL获取user1下的所有表名肯定需要dba的权限,通过查询dba的什么什么表才能获取..

解决

通过各种百度与实践..我找到了1个视图,dba_tables.查询这个视图可以得到一个用户下的所有表..

create or replace procedure test(v_from in varchar2, v_to in varchar2) is
  v_sql varchar2(1000);
  cursor v_cur is
    select t.* from dba_tables t where t.OWNER = v_from;

begin
  for v_row in v_cur loop
    v_sql := 'grant select on ' || v_from || '.' || v_row.table_name ||
            ' to ' || v_to;
    execute immediate v_sql;
  end loop;
end test;


解释如下:

我创建了这个test存储过程,它有2个入参,v_from和v_to,表示我准备将v_from用户下的所有表的select权限赋值给v_to用户,然后test存储过程里面有一个游标v_cur,这个游标就是为了找出用户v_from下的所有表...这个游标是通过dba_tables视图加上where条件过滤用户名得到的..

得到这个v_from用户下的所有表以后我打算构造一个SQL,用来赋权限,这个SQL就是保存在v_sql中..

在loop中,每次loop都可以得到1个v_from用户的表名,存储在v_row.table_name中.通过拼接字符串可以得到v_sql授权语句.

运行这个授权语句..然后继续下一次的loop得到新的表名.


实测如下:

--创建过程
create or replace procedure cp_grant1(v_from in varchar2, v_to in varchar2) is
  v_sql varchar2(1000);
  cursor v_cur is
     select t.* from dba_tables t where t.OWNER = v_from; 
begin
   for v_row in v_cur loop
     v_sql := 'grant select,insert,update,delete on ' || v_from || '.' || v_row.table_name ||' to ' || v_to;
     dbms_output.put_line(v_sql);
     execute immediate v_sql;
   end loop;
end cp_grant1;

--执行
Begin
    cp_grant1('DSdba','testdba');
end;

不知为什么,没有生效 

--还是使用传统方法,生成Sql语句,再执行
select 'grant select,insert,update,delete on '||dt.owner||'.'||dt.table_name||' to testdba;'
from dba_tables dt
where dt.owner='CNDBA'

Tag: Oracle基础
我也要发一个   ·   返回首页   ·   返回[Oracle]   ·   前一个   ·   下一个
欢迎评论
未登录,
请先 [ 注册 ] or [ 登录 ]
(一分钟即可完成注册!)
返回首页     ·   返回[Oracle]   ·   返回顶部