我需要在Oracle 10g数据库(10.2.0.3)中检索某个数据库模式的可用序列列表。
使用架构所有者,我可以简单地执行以下操作来实现此目的:
SELECT sequence_name FROM all_sequences WHERE sequence_owner = 'ABCDEF';
但是,如果我使用分配了自定义“只读”角色的用户,则该用户在执行该查询时不会获得任何行。
我玩了一下,发现将序列上的SELECT
选项授予只读角色会使这些序列在与只读用户连接时出现在all_sequences
视图中。 / p>
但是这意味着只读用户可以
SELECT my_sequence.NEXTVAL FROM DUAL;
这对我们的情况来说是不行的(毕竟,只读用户不能修改任何东西,甚至不能修改序列。)
是否有另一种检索序列的方法,不允许选择NEXTVAL
?
[编辑:]
如果我这样做
SELECT DISTINCT sequence_owner FROM all_sequences;
我得到以下列表:
SEQUENCE_OWNER
------------------------------
MDSYS
DMSYS
OLAPSYS
XDB
SYS
5 rows selected
使用system
用户后执行
GRANT SELECT ANY DICTIONARY TO MY_USER;
结果保持不变(撤销也不会改变任何东西)。
授予SELECT_CATALOG_ROLE
代替也不起作用。
在至少一个序列上授予SELECT
但是会将结果更改为包含我自己的架构所有者。
答案 0 :(得分:3)
您可以尝试授予SELECT ANY DICTIONARY权限,但出于安全原因这非常糟糕,因此,我想,您的DBA会否认它。
好的决定是创建table function发布所需数据。默认情况下,此函数将与AUTHID DEFINER权限一起使用,因此您只需将其授予只读用户,它就会收到序列信息而无需更改它们。
答案 1 :(得分:2)
我能想出的最佳解决方案是授予用户SELECT ANY DICTIONARY
。这将使他们无需访问对象即可访问DBA_SEQUENCES
(以及所有其他DBA_
视图)。