是否有可能在all_sequences中看到序列而序列上没有SELECT权限?

时间:2014-12-15 14:03:05

标签: oracle oracle10g

我需要在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但是会​​将结果更改为包含我自己的架构所有者。

2 个答案:

答案 0 :(得分:3)

您可以尝试授予SELECT ANY DICTIONARY权限,但出于安全原因这非常糟糕,因此,我想,您的DBA会否认它。

好的决定是创建table function发布所需数据。默认情况下,此函数将与AUTHID DEFINER权限一起使用,因此您只需将其授予只读用户,它就会收到序列信息而无需更改它们。

答案 1 :(得分:2)

我能想出的最佳解决方案是授予用户SELECT ANY DICTIONARY。这将使他们无需访问对象即可访问DBA_SEQUENCES(以及所有其他DBA_视图)。