Oracle SQL 开发人员 - 如何限制用户仅查看特定模式

Oracle SQL Developer - How to Restrict User to See Only Specific Schemas

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

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

如果可能的话,你是怎么做到的?

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

本质上你不能。如果在连接面板中展开 'other users' 部分时查看 SQL Developer 中的语句日志,您会看到它使用的命令是:

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

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

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

SQL 开发人员允许您在连接窗格中过滤内容。如果您在 'other users' 上 right-click 并选择 'apply filter...',您将看到如下对话框:

您可以将其设置为 'match any' 以及您希望显示的所有模式,单击绿色加号添加更多。只有那些用户才会显示在 'other users' 下。当您展开 'other users' 时,语句日志会改为显示此修改后的查询:

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 副本上设置它(可能是手动的,尽管你可以考虑提供一个配置文件),并且用户可以轻松移除或更换过滤器。它影响的是客户端而不是用户,而且很容易被回避。

基本上,您只能在 SQL 开发人员中执行您可以在数据库中执行的其他操作。

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

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

根据您的业务需要,您可以撤销 select 用户的 PUBLIC 角色(然后创建您想要授予他们的特权包,以替换他们以这种方式失去的东西),或者 - 更彻底,也许不是你应该做的事 - 你可以简单地 revoke select on all_users from public; (同时使用 SYSDBA 权限登录,或其他足以执行此操作的权限)。

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

我刚刚测试了这个 - 我登录 as sysdba,在 SYS.ALL_USERS 上从 PUBLIC 撤销了 select,然后关闭 SQL Developer 并重新启动它.果然,我再也无法从我在数据库中创建的任何自定义用户中看到任何 "other users"(意思是,从我为这些用户创建的 SQL 开发人员连接)。