Oracle下批量将一个用户的所有表的select权限赋值给另外一个用户

摘要:
用户user2也存在于实际的生产环境中。所以我需要做的是将我们的user2相关表的查询权限分配给user1。当我实际解决了这个问题时,我手动编写了SQL来分配权限。因为依赖表不多。解决了这个问题后,我想起来,dba_tables。查询此视图以获取某个用户下的所有表,我不会啰嗦,我将转到_用户下所有表的选择权限分配给v_to用户,
起因

  为什么会有这篇文章呢? 因为最近在做项目的时候遇到一个问题...实际生产环境中程序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用户下的所有表都没有授权给过其他用户)

Oracle下批量将一个用户的所有表的select权限赋值给另外一个用户第1张

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

Oracle下批量将一个用户的所有表的select权限赋值给另外一个用户第2张

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

Oracle下批量将一个用户的所有表的select权限赋值给另外一个用户第3张

小结

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

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

免责声明:文章转载自《Oracle下批量将一个用户的所有表的select权限赋值给另外一个用户》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇JBoss环境搭建Modbus库开发笔记之一:实现功能的基本设计下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

空连接ipc$入侵

使用命令 net use url=file://\IPipc$\IPipc$ "" /user:"" 就可以简单地和目标建立一个空连接(需要目标开放ipc$)。 1.基本简介 网上关于 ipc$ 入侵的文章可谓多如牛毛,攻击步骤甚至已经成了固化的模式,因此也没人愿意再把这已经成为定式的东西拿出来摆弄。不过话虽这样说,我认为这些文章讲解的并不详细,一些内容甚...

dotnet 判断程序当前使用管理员运行降低权使用普通权限运行

有一些程序是不想通过管理员权限运行的,因为在很多文件的读写,如果用了管理员权限程序写入的程序,其他普通权限的程序是无法直接访问的。本文告诉大家如何判断当前的程序是通过管理员权限运行,然后通过资源管理器使用普通权限运行 通过下面代码可以判断当前的程序是管理员权限运行 var identity = WindowsIdentity.Get...

动态添加数据源,根据用户登录切换数据库.编程式Spring事务.

根据用户注册,系统自动创建私有数据库,用户登录,动态添加数据源到Spring数据路由,Session超时删除数据源 好处:当数据量大的时候,类似水平切割效果,效率会高一些 坏处:数据源切换,Spring 事务处理比较繁琐,数据连接处理不好会有很大消耗,如果涉及后台系统管理数据,也比较繁琐. 使用Spring数据源路由,现在好像没有直接添加数据源的方法,无奈...

windows开机显示无法登陆你的账号,你的所有操作将不会被保存!变相系统还原?

■  如果你的电脑开机的时候出现这种提示 ■  别急,这可能只是一些爱倒腾的同学不小心删除了系统账户文件导致的,我们要吧这些系统账户文件再找回来 ■  计算机——》属性——》高级系统设置——》用户配置文件设置——》默认配置文件更改——》目标目录C:UsersAdministrator 如下图,做完更改重启即可。 ■  如果说因为丢失了系统用户管理...

telent三种认证及vlan简单划分

实验一 telent三种认证方式登录 实验拓扑图如下: 操作过程: 1.认证模式为none R1操作:       1.system-view进入系统试图2.telnet server enable开启Telnet服务3.改名sys R14.int G0/0端口5.ip address x.x.x.x xx 配置ip地址6.exit退出对R2操作:1.s...

Oracle用户,权限,角色以及登录管理 scoot 授权

Oracle用户,权限,角色以及登录管理 1. sys和system用户的区别 system用户只能用normal身份登陆em。除非你对它授予了sysdba的系统权限或者syspoer系统权限。sys用户具有“SYSDBA”或者“SYSOPER”权限,登陆em也只能用这两个身份,不能用normal。 -- 最重要的区别,存储的数据的重要性不同 sys所有...