让用户访问 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 中的其他模式的正确方法的主要内容,如果未能解决你的问题,请参考以下文章