繁体   English   中英

让用户访问 Oracle 中其他模式的正确方法

[英]Correct way to give users access to additional schemas in Oracle

我在 Oracle 中有两个用户 Bob 和 Alice,这两个用户都是通过从 sqlplus 以 sysdba 身份运行以下命令创建的:

create user $blah identified by $password;
   grant resource, connect, create view to $blah;

我希望 Bob 能够完全访问 Alice 的模式(即所有表),但我不确定要运行什么授权,以及是否以 sysdba 或 Alice 身份运行它。

很高兴听到关于参考资料的任何好的指针——似乎无法从 Internet 或我办公桌上的“Oracle 数据库 10g 完整参考”中得到一个好的答案。

AFAIK 你需要一次做一个授权对象。

通常,您会使用脚本来执行此操作,大致如下:

SELECT 'GRANT ALL ON '||table_name||' TO BOB;'
FROM   ALL_TABLES
WHERE  OWNER = 'ALICE';

与其他 db 对象类似。

您可以在每个架构中放置一个包,您需要从中发出授权,从中通过 EXECUTE IMMEDIATE 调用每个 GRANT 语句。

例如

   PROCEDURE GRANT_TABLES
   IS
   BEGIN

      FOR tab IN (SELECT table_name
                  FROM   all_tables
                  WHERE  owner = this_user) LOOP
         EXECUTE IMMEDIATE 'GRANT SELECT, INSERT, UPDATE, DELETE ON '||tab.table_name||' TO other_user';
      END LOOP;
   END;

有很多事情需要考虑。 当你说访问时,你想用其他用户名作为表的前缀吗? 如果这是一个问题,您可以使用公共同义词,以便您可以隐藏原始所有者。 然后授予同义词的特权。

您还希望尽可能提前计划。 稍后,您是否希望 Frank 也能够访问 Alice 的模式? 您不想重新授予对 N 个表的权限。 使用数据库角色将是更好的解决方案。 例如,将 select 授予角色“ALICE_TABLES”,当另一个用户需要访问时,只需授予他们对该角色的权限。 这有助于组织您在数据库中所做的授权。

如果您有不同的所有者,则另一种解决方案:

BEGIN

  FOR x IN (SELECT owner||'.'||table_name ownertab
            FROM   all_tables
            WHERE  owner IN ('A', 'B', 'C', 'D'))
  LOOP
    EXECUTE IMMEDIATE 'GRANT SELECT ON '||x.ownertab||' TO other_user';
  END LOOP;
END;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM