现在有一个需求,需要开放一些"特殊“的权限给开发组。
具体的背景是这样的:
有三个数据库用户,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 的情况。