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

Posted

技术标签:

【中文标题】让用户访问 Oracle 中的其他模式的正确方法【英文标题】:Correct way to give users access to additional schemas in Oracle 【发布时间】:2010-09-16 23:17:43 【问题描述】:

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

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

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

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

【问题讨论】:

sql-grant 标签正在添加过程中,以与为响应 MSO 问题 Split "revoke" tag into "sql-revoke" and "token-revoke" 而创建的 sql-revoke 标签平行。在适当的时候,grant 标签将被删除。 【参考方案1】:

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;

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

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;

【讨论】:

以上是关于让用户访问 Oracle 中的其他模式的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

grant权限

Oracle中的锁

Oracle数据库访问其他用户下的表,不加表所属的用户名的实现方法

oracle数据库

oracle给远程连接的用户授权。

让网站只有装了证书才可以访问