Oracle11g Oracle SQL Developer-如何限制用户仅查看特定架构

Oracle11g Oracle SQL Developer-如何限制用户仅查看特定架构,oracle11g,schema,oracle-sqldeveloper,database-schema,Oracle11g,Schema,Oracle Sqldeveloper,Database Schema,在OracleDB11g中,我使用SQLDeveloper创建了一个用户,该用户具有仅具有只读权限的关联模式。现在,我想限制新用户查看除我选择的几个用户/模式之外的其他用户/模式 换句话说,当他们(在SQLDeveloper中)转到自己模式下的“其他用户”文件夹时,我不希望该用户能够看到该数据库中的所有其他用户。我只想让他们看到一些精选的 如果可能的话,你怎么做 顺便说一句。。。我知道我可以限制他们对其他用户做任何事情(例如创建表、运行查询等)。但是,我想阻止他们查看或看到其他用户在那里。基本上

在OracleDB11g中,我使用SQLDeveloper创建了一个用户,该用户具有仅具有只读权限的关联模式。现在,我想限制新用户查看除我选择的几个用户/模式之外的其他用户/模式

换句话说,当他们(在SQLDeveloper中)转到自己模式下的“其他用户”文件夹时,我不希望该用户能够看到该数据库中的所有其他用户。我只想让他们看到一些精选的

如果可能的话,你怎么做


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

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

select * from (select USERNAME
FROM SYS.ALL_USERS au
WHERE au.USERNAME != USER
 );
仅被授予连接权限的全新用户可以查看该系统视图中列出的所有用户

由于该查询使用
sys
模式限定
all_users
对象名称,因此您甚至不能为用户创建一个提供受限列表的视图或私有同义词。当然,如果用户愿意,他们也可以避开这个问题

SQL Developer确实允许您在“连接”窗格中过滤内容。如果右键单击“其他用户”并选择“应用过滤器…”,您将看到如下对话框:

您可以使用“匹配任意”和所有希望可见的模式来设置它,单击绿色加号以添加更多内容。只有这些用户才会显示在“其他用户”下。展开“其他用户”时,语句日志将显示此修改后的查询:

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”


但是您不能集中控制,您必须在每个人的SQLDeveloper副本上设置它(可能是手动的,尽管您可以查看提供的配置文件),并且用户可以轻松地删除或更改过滤器。它影响的是客户机,而不是用户,而且很容易被忽略。

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

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

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

根据您的业务需要,您可以从所选用户中撤销PUBLIC角色(然后创建您想要授予他们的特权束,以替换他们以这种方式失去的特权),或者-更彻底地说,也许不是您应该做的事情-您可以简单地从PUBLIC
撤销对所有\u用户的选择(使用SYSDBA权限或其他足以执行此操作的权限登录时)

编辑-我刚检查过,不幸的是不能撤销公共角色;它自动授予数据库中的所有用户,并且不能更改。这只留下了一个不太理想的选择,那就是破坏公众自身的特权结束编辑


我刚刚测试了这个-我以sysdba的身份登录了
,撤销了对SYS.ALL_用户的选择,然后关闭了SQL Developer并重新启动它。果不其然,我不再能够从我在数据库中创建的任何自定义用户(也就是说,从我为这些用户创建的SQL Developer连接)中看到任何“其他用户”。

Grrr。好啊因此,即使我在我的一端应用过滤器,它也不会显示在他们的一端?这就是您的意思吗?无法集中控制?是的,更改客户端(即PC上的SQL Developer)上的筛选器或首选项不会影响其他任何人。如果您能找到正确的配置文件和与过滤器相关的位,您可能会找到一种方法来分发它,但并不容易。(Oracle确实有VPD…但我不确定是否可以(或应该)应用于系统视图;可能需要进行调查以确保…)如果您感兴趣,这是一个数据库问题,而不是SQL开发人员的问题。我在刚刚发布的一个回答中进一步解释了这一点。是的,这就是我回答的前半部分所说的;只有第二部分是关于SQL开发人员的。不过,我不愿意乱用sys对象或priv,即使是同义词,以防任何其他内部假设它们存在(例如,EM查询,尽管大多数查询可能会像SD那样直接访问对象)。非常好。谢谢你的帮助,太好了。谢谢您的帮助。@ptownbro-请注意我的编辑-不幸的是,不能从用户那里拿走PUBLIC;唯一的解决方案是从PUBLIC中撤销SELECT on SYS.ALL_用户,这可能会对其他用户(很可能对需要访问该表的进程和应用程序)产生恶劣影响。