将指定用户下所有表的查询权限赋权给查询用户
将指定用户下所有表的查询权限赋权给查询用户[转]
-----------------------------------------------2013/11/1
oracle的开发和管理往往都是分开的,当然不否认这种"集万千宠爱于一身"的人才也大有人在,但是在公司,往往开发人员兼顾程序和数据库的设计与开发,而oracle dba则是负责oracle的安全与维护。那么这就出现了一个问题,权限问题,不是所有人都可以有dba权限的,这样很容易造成不安全的隐患。所以要合理的分配用户和权限。 以下举例说明:
一、创建了一个查询用户rptuser,该用户具有scott(根据公司具体要求替换用户)用户下所有表的查询权限。
注意:如果只是把scott用户下emp表的select权限赋权给rptuser,那么很简单,直接在dba用户下执行grant select on scott.emp to rptuser;即可,那是因为仅此一条语句,所以可以直接赋权,若是要求将一个具有几千几万张表的用户(此时若不是scott用户只有9张表)下的所有表赋权给一个查询用户,那岂不是悲剧了?
稍安勿躁,下面有请"绝招"上场,大家鼓掌欢迎~~吼吼
二、两种方式:此处我采用方法二列举过程
1.select 'grant select on '|| tname ||' to rptuser ;' from tab;
(当前用户有dba权限如system或者sysdba,执行输出脚本)
2.select 'grant select on user.' || tname || ' to rptuser;' from tab;
(当前用户无dba权限也就是scott用户,用system或者sysdba用户执行输出脚本)
输出内容为:
-
grant select on DEPT to rptuser ;
-
grant select on EMP to rptuser ;
-
grant select on BONUS to rptuser ;
-
grant select on SALGRADE to rptuser ;
-
grant select on AVGSAL to rptuser ;
-
grant select on BOOK to rptuser ;
-
grant select on TEST_INDEX to rptuser ;
-
grant select on TB_EMPLOYEES to rptuser ;
三、直接复制此内容使用system用户执行即可,这里我使用的是oracle的客户端Toad for oracle,执行结果如下:

赋权执行成功。
四、再用具有dba权限的用户给rptuser用户赋予建同义词的权限
grant create synonym to rptuser;
五、再在scott用户下执行
select 'create synonym ' || tname || ' for scott.' || tname || ';' from tab;
或者
select 'create synonym '|| table_name || ' for scott.' || table_name || ';' from user_tables;
输出脚本内容为:
-
create synonym DEPT for scott.DEPT;
-
create synonym EMP for scott.EMP;
-
create synonym BONUS for scott.BONUS;
-
create synonym SALGRADE for scott.SALGRADE;
-
create synonym BOOK for scott.BOOK;
-
create synonym TB_EMPLOYEES for scott.TB_EMPLOYEES;
-
create synonym TEST_INDEX for scott.TEST_INDEX;
六、最后将这个脚本内容用rptuser查询用户执行,完成
七、用rptuser用户查询scott用户下的表,即无需from scott.tablename了,可以直接查询了
-
SQL> show user;
-
USER is "RPTUSER"
-
SQL> select * from dept;
-
DEPTNO DNAME LOC
-
---------- -------------- -------------
-
10 ACCOUNTING NEW YORK
-
20 RESEARCH DALLAS
-
30 SALES CHICAGO
-
40 OPERATIONS BOSTON
总结:这种办法的好处就是可以使dba简化繁琐的工作,若是一张一张表的赋权,那么要是遇到一个用户几千张,不,估计几十张,你就得疯了,所以采用此方法。
举一反三:如果赋权给查询用户sequence的查询权限也是一样,我想大家都看得明白了,仅给出语句,过程就不写了,呵呵。
select 'grant select on ' || sequence_name || ' to itreport;' from dba_sequences where sequence_owner='USER_NAME';
注意两点:1.此处应该用具有dba权限的用户执行此语句
2.红色部分USER_NAME为具体用户名
其他过程如上所述,此处省略十分钟的口水。。。。
分类:
Oracle Basic
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端