我在Oracle中有两个用户Bob和Alice,都是通过从sqlplus运行以下命令sysdba创建的:
create user $blah identified by $password; grant resource, connect, create view to $blah;
我希望Bob可以完全访问Alice的架构(即所有表),但我不确定要运行什么授权,以及是以sysdba还是以Alice身份运行它。
很高兴听到有关参考材料的任何好的指示 - 似乎无法从互联网或“Oracle数据库10g完整参考”中找到一个好的答案,它位于我的台。
答案 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;