14

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

   创建由 $password 标识的用户 $blah;
   向 $blah 授予资源、连接、创建视图;

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

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

4

3 回答 3

21

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

通常,您会使用脚本来执行此操作,类似于:

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

其他数据库对象也类似。

您可以在需要发出授权的每个模式中放置一个包,从该模式中将通过 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;
于 2008-10-13T20:41:59.753 回答
7

有很多事情需要考虑。当您说访问权限时,您是否要在表前加上其他用户名?您可以使用公共同义词,以便隐藏原始所有者(如果这是一个问题)。然后授予同义词的权限。

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

于 2008-10-13T20:49:14.327 回答
6

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

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;
于 2010-05-07T14:05:02.443 回答