【问题标题】:Oracle SQL Developer - How to Restrict User to See Only Specific SchemasOracle SQL Developer - 如何限制用户只能查看特定模式
【发布时间】:2017-07-07 09:47:31
【问题描述】:

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

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

如果可能,你会怎么做?

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

【问题讨论】:

    标签: oracle11g schema oracle-sqldeveloper database-schema


    【解决方案1】:

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

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

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

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

    编辑 - 我刚刚检查过,不幸的是无法撤销 PUBLIC 角色;它会自动授予数据库中的所有用户并且无法更改。这只留下了与 PUBLIC 本身拥有的特权相混淆的不太理想的替代方案。 结束编辑

    我刚刚对此进行了测试 - 我登录了 as sysdba,从 PUBLIC 撤销了对 SYS.ALL_USERS 的选择,然后关闭了 SQL Developer 并重新启动它。果然,我再也看不到我在数据库中创建的任何自定义用户(即我为这些用户创建的 SQL Developer 连接)中的任何“其他用户”。

    【讨论】:

    • 优秀。感谢您的帮助。
    • @ptownbro - 请注意我的编辑 - 遗憾的是 PUBLIC 无法从用户手中夺走;唯一的解决方案是从 PUBLIC 撤消 SYS.ALL_USERS 上的 SELECT,这可能会对其他用户产生不良影响(并且很可能对可能需要访问该表的进程和应用程序产生不利影响)。
    【解决方案2】:

    你不能,基本上。如果您在连接面板中展开“其他用户”部分时查看 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"

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

    【讨论】:

    • Grrr。好的。所以即使我在我的一端应用过滤器,它也不会显示在他们的一端?你的意思是不能集中控制吗?
    • 是的,在您的客户端(即您的 PC 上的 SQL Developer)上更改过滤器或首选项不会影响其他任何人。如果你能找到正确的配置文件和与过滤器相关的位,你可能会找到一种分发它的方法,但并不容易。 (Oracle 确实有 VPD ......但我不确定是否可以(或应该)应用于系统视图;可能需要研究以确保......)
    • 如果您有兴趣 - 这是一个数据库问题,而不是 SQL Developer 问题。我在刚刚发布的答案中进一步解释。
    • 是的,这就是我回答的前半部分所说的;只有后半部分是关于 SQL Developer。不过,我不愿意与 sys 对象或 privs 混淆,即使是同义词,以防其他任何内部假设它们存在(例如,EM 查询,尽管大多数可能会直接访问对象,就像 SD 所做的那样)。
    • 优秀。感谢您的帮助。
    猜你喜欢
    • 2012-07-13
    • 2012-12-29
    • 2023-04-11
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2019-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多