我在Oracle中有两个用户Bob和Alice,它们都是通过从sqlplus运行以下命令sysdba创建的:
create user $blah identified by $password; grant resource, connect, create view to $blah;
我希望Bob能够完全访问Alice的架构(即所有表),但我不确定要运行什么授权,以及是以sysdba还是以Alice身份运行它.
很高兴听到有关参考材料的任何好的指示 - 似乎无法通过互联网或"Oracle数据库10g完整参考"找到一个很好的答案,它位于我的桌面上.
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;
有很多事情需要考虑.当您说访问权限时,是否要在表格前添加其他用户名称?您可以使用公共同义词,以便隐藏原始所有者(如果这是一个问题).然后在同义词上授予privs.
您还希望尽可能提前计划.之后,您是否希望Frank能够访问Alice的架构?您不希望在N个表上拥有regrant特权.使用数据库角色将是更好的解决方案.例如,将select选择授予角色"ALICE_TABLES",当另一个用户需要访问权限时,只需授予他们角色权限.这有助于组织您在数据库中进行的授权.
如果您拥有不同的所有者,则另
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;