Oracle SQL Developer - 如何限制用户仅查看特定模式

时间:2017-02-17 18:38:44

标签: oracle11g schema oracle-sqldeveloper database-schema

在Oracle DB 11g中,使用SQL Developer,我创建了一个具有关联模式的用户,该模式只具有只读权限。现在我想限制新用户能够查看其他用户/模式,除了我选择的一些用户/模式。

换句话说,当他们(在SQL Developer中)转到"其他用户"在他们自己的架构下的文件夹,我不希望该用户能够看到该数据库上的所有其他用户。我只想让他们看几个选择的。

如果可能,你怎么做?

顺便说一下......我知道我可以限制他们对其他用户做任何事情(例如创建表格,运行查询等等)。但是,我想阻止他们甚至查看或查看那些其他用户在那里。

2 个答案:

答案 0 :(得分:2)

基本上你不能。如果您在扩展“其他用户”时查看SQL Developer中的语句日志。在连接面板中,您将看到它使用的命令是:

select * from (select USERNAME
FROM SYS.ALL_USERS au
WHERE au.USERNAME != USER
 );

仅被授予连接权限的全新用户可以查看从该系统视图中列出的所有用户。

由于该查询使用all_users架构限定sys对象名称,因此您甚至无法为提供受限列表的用户创建视图或私有同义词。当然,如果他们想要,用户也可以回避这一点。

SQL Developer允许您过滤连接窗格中的内容。如果您右键点击其他用户'并选择“应用过滤器...'您会看到如下对话框:

apply filter dialog

您可以设置匹配任何'以及您希望看到的所有模式,单击绿色加号以添加更多模式。只有那些用户才会在其他用户下显示。当您扩展“其他用户”时语句日志改为显示此修改后的查询:

select * from (select USERNAME
FROM SYS.ALL_USERS au
WHERE au.USERNAME != USER
 ) WHERE (UPPER(USERNAME) = (UPPER(:SCHEMA)) OR UPPER(USERNAME) = (UPPER(:SCHEMA0)))

...它显示绑定参数为"SCHEMA"="SOUSER1", "SCHEMA0"="SOUSER2"

但是你不能集中控制它,你必须在每个人的SQL Developer副本上设置它(可能手动,但你可以看看提供配置文件),用户可以轻松移除或更换过滤器。它会影响客户而不是用户,并且可以轻易地回避。

答案 1 :(得分:2)

基本上,您只能在SQL Developer中执行您在数据库中可以执行的操作。

正如Alex所说,SQL Developer使用来自SYS.ALL_USERS的SELECT来查看系统中的所有用户。这不是SQL Developer问题;如果您的用户有权访问SQL * Plus,则可以直接针对数据库运行select username from sys.all_users并获取相同的信息。

从用户删除该信息遵循相同的路径。只能从已被授予SELECT权限的表中进行SELECT。从目录表和视图(特别是SYS模式中的ALL_USERS)中选择通常是间接授权:PUBLIC角色有权从这些表中进行SELECT,在大多数情况下(可能默认情况下?取决于您的管理工具)new用户被授予PUBLIC角色。

根据您的业务需求,您可以从所选用户中撤消PUBLIC角色(然后创建您想要授予他们的特权束,以替换他们以这种方式丢失的特权),或者 - 更彻底地,也许不是某些东西您应该这样做 - 您可以简单地revoke select on all_users from public;(使用SYSDBA权限登录,或者其他一些足以执行此操作的权限)。

编辑 - 我刚检查过,遗憾的是无法取消PUBLIC角色;它会自动授予数据库中的所有用户,并且无法更改。这留下了不太可取的替代方法,即弄乱PUBLIC本身拥有的权限。 结束修改

我刚测试了这个 - 我登录了as sysdba,从PUBLIC撤消了对SYS.ALL_USERS的select,然后关闭了SQL Developer并重新启动它。果然,我再也看不到任何"其他用户"来自我在数据库中创建的任何自定义用户(意思是,我为这些用户创建的SQL Developer连接)。