正确的方法,使用户可以访问Oracle中的其他模式

时间:2008-10-13 20:39:30

标签: oracle schema grant

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

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

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

很高兴听到有关参考材料的任何好的指示 - 似乎无法从互联网或“Oracle数据库10g完整参考”中找到一个好的答案,它位于我的台。

3 个答案:

答案 0 :(得分:20)

AFAIK您需要一次执行一次授予对象。

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

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

与其他数据库对象类似。

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

e.g。

   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;

答案 1 :(得分:7)

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

您还希望尽可能提前计划。之后,您是否希望Frank能够访问Alice的架构?您不希望在N个表上拥有regrant特权。使用数据库角色将是更好的解决方案。例如,将select选择授予角色“ALICE_TABLES”,当另一个用户需要访问权限时,只需授予他们角色权限。这有助于组织您在数据库中进行的授权。

答案 2 :(得分: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;