zoukankan      html  css  js  c++  java
  • Oracle下批量将一个用户的所有表的select权限赋值给另外一个用户

    起因

      为什么会有这篇文章呢? 因为最近在做项目的时候遇到一个问题...实际生产环境中程序datasource登陆的Oracle数据库用户user1不是我们创建的.这个用户没有访问我们业务表的权限(因为和其他公司合作,用user1去访问它们的数据)....我们开发中用到的用户user2是我们自己创建的有相关业务表的权限,而这个用户user2在实际生产环境中也是有的...

      所以我要做的事情就是把我们user2的相关表的查询权限赋值给user1就行了...实际解决那个问题的时候我是手动写SQL赋权限的...因为依赖的表不多...

      这个问题解决以后我思考了下,其实这个问题简化抽象一下的话就是问 如何能够批量把一个用户下的所有表的select权限赋值给另外一个用户 

      这个问题我百度了下,有一些解决办法,比如可以将表的权限赋值给public..但是这些都不是特别好的(因为这样随便哪个用户都能访问你的业务表,很不安全)....

    解决办法

    已知

    首先应该整理一下我已知的知识,然后再去想办法...我已知的事情是:

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

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

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

    解决

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

    我就不啰嗦了,直接贴代码..

     1 create or replace procedure test(v_from in varchar2, v_to in varchar2) is
     2   v_sql varchar2(1000);
     3   cursor v_cur is
     4     select t.* from dba_tables t where t.OWNER = v_from;
     5 
     6 begin
     7   for v_row in v_cur loop
     8     v_sql := 'grant select on ' || v_from || '.' || v_row.table_name ||
     9              ' to ' || v_to;
    10     execute immediate v_sql;
    11   end loop;
    12 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得到新的表名.

    以上便是我的思路...

    测试

    我新建了用户JYZ1和JYZ2,都是普通用户,然后我在JYZ1下新建了2张表,t1和t2....JYZ2是没有权限select的...(如下图,dba_tab_privs可以查询一张表授权给过哪些用户,图中没有记录表示JYZ1用户下的所有表都没有授权给过其他用户)

    运行存储过程(我是用system connect as sysdba执行的)

    运行test以后可以发现现在JYZ2有JYZ1的表的权限了.

    小结

    通过我上面那个test存储过程可以将一个用户下的所有表的select权限赋值给另外一个用户,当然如果要增加其他权限,比如update什么的,可以直接修改SQL,也是比较方便的...

    另外需要特别注意的就是这个存储过程我用system connect as normal的时候不知到为什么一直编译不通过,即使system确实是有dba的权限的...而system connect as dba的时候才可以执行..不明白为什么....

  • 相关阅读:
    独家全新2019超级签名源码/超级签/ios分发/签名端本地linux服务器完成签名带部署文档
    YYC松鼠短视频系统加入openinstall插件SDK实现免邀请码注册统计和安装统计-详细方法
    程序员男朋友没空搭理人吗?现实中程序员真的忙到女朋友都不要搭理了吗?
    献给攻击者,请放弃攻击吧,这样只会浪费自己的青春+金钱
    新奇怪知识:用ps导出gif图片放在网页上可实现只循环一次并且定格不变,本地一直循环
    uniapp配置去掉友盟无法打包,提示配置错误如何解决
    git切换分支报错error: Your local changes to the following files would be overwritten by checkout:
    数字信号处理--卷积的意义
    傅立叶分析和小波分析之间的关系?
    傅里叶变换:MP3、JPEG和Siri背后的数学
  • 原文地址:https://www.cnblogs.com/abcwt112/p/5507917.html
Copyright © 2011-2022 走看看