现在有一个需求,需要开放一些"特殊“的权限给开发组。
具体的背景是这样的:
有三个数据库用户,tabowner, tabconn, tab_temp三个用户
tableowner是owner用户,里面存放着表,索引,序列,存储过程等。
tabconn是一个连接用户,在这个用户里面建立了一些同义词,可以直接通过这个用户来进行数据的增删改查。
tab_temp是一个临时的连接用户,通过这个用户只能查询一些有限的信息,不能进行数据的改动。而且不能执行select sequence_name.nextval from dual这样类型的语句,避免人为干扰sequence的增长。
现在的问题是,因为没有开放select on sequence的权限给tab_temp,所以通过tab_temp无法查询到tabowner里的sequence信息。
举个简单的例子。
--tabowner创建一个视图,从user_sequence里面查询当前schema中的sequence信息,得到的结果是实时的。
SQL> create view a as select *from user_sequences;
View created.
--里面有198条记录
SQL> select count(*)from a;
COUNT(*)
----------
198
如果我尝试把视图访问的权限赋予tabconn,那么是否可以通过tabconn访问到tabowner中的user_sequences信息呢?
SQL> grant select on a to tabconn;
Grant succeeded.
SQL> conn tabconn/tabconn
Connected.
SQL> select count(*)from tabowner.a;
COUNT(*)
----------
0
可以看到,这样是行不通的
不过可以做一个小把戏,使得权限的访问可以选择性的开放。通过dblink
目前tabconn可以访问all_sequences的信息,里面包含tabowner里的sequence信息
可以在tab_temp下创建一个db link,然后通过这个db link来做一些工作。
SQL> conn tab_temp/tab_temp
Connected.
SQL>
SQL> create database link temp_link connect to tabconn identified by tabconnusing 'TESTDB';
Database link created.
SQL> select count(*)from all_sequences@temp_link;
COUNT(*)
----------
230
可以看到能够查到数据了,不过如果足够细心的话,发现结果好像多了一点,按照我们的要求,指定查询的是tabowner下的sequence信息。
SQL> select count(*) from all_sequences@temp_link where sequence_owner='TABOWNER'
2 /
COUNT(*)
----------
197
这样就没有问题了。
创建视图
create view sequence_summary_v as select *from all_sequences@temp_link where sequence_owner='TABOWNER';
直接暴露视图也不太好,可以通过同义词来进行屏蔽
SQL> select count(*)from sequence_summary;
COUNT(*)
----------
197
SQL> create synonym sequence_summary for sequence_summary_v;
Synonym created.
这样对于开发来说,就能够查到实时的sequence信息了。而且也能够杜绝增长/修改sequence value 的情况。
关于权限设置的一个小把戏(r2第27天)
原创jeanron100 ©著作权
©著作权归作者所有:来自51CTO博客作者jeanron100的原创作品,请联系作者获取转载授权,否则将追究法律责任
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
一个“小把戏”“哄得”小朋友挺满意
前几天,去一个用户那里解决些琐碎的事情,解决完主要问题,和一个小朋友闲聊,他有点愁眉不展、郁郁寡欢的样子,似乎没心情和
SQL tuning partiton 优化 分区 -
Linux shell中的那些小把戏
我日常使用Linux shell(Bash),但是我经常忘记一些有用
操作系统 shell git bash xml