当前位置:  开发笔记 > 数据库 > 正文

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

如何解决《正确的方法,使用户可以访问Oracle中的其他模式》经验,为你挑选了3个好方法。

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

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

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

很高兴听到有关参考材料的任何好的指示 - 似乎无法通过互联网或"Oracle数据库10g完整参考"找到一个很好的答案,它位于我的桌面上.



1> cagcowboy..:

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;



2> Brett McCann..:

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

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



3> arnep..:

如果您拥有不同的所有者,则另

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;

推荐阅读
Chloemw
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有