2008-10-13 31 views
13

我有两个用户Alice和Bob在Oracle中,无论是从sqlplus中运行以下命令以SYSDBA创建:正确的方式,让用户访问其他架构中的Oracle

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

我想鲍勃拥有完全访问权限到爱丽丝的模式(即所有表),但我不确定要运行的授权以及是否将其作为sysdba或Alice运行。

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

回答

20

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; 
7

有很多事情要考虑。当你说访问时,你想用其他用户名称作为前缀吗?如果这是一个问题,您可以使用公共同义词,以便隐藏原始所有者。然后给同义词赋予priv。

你也想尽可能提前计划。稍后,你会希望Frank能够访问Alice的模式吗?您不希望在N个表上重新授予权限。使用数据库角色将是更好的解决方案。例如,授予select到角色“ALICE_TABLES”的权限,并在其他用户需要访问权限时,授予他们对该角色的特权。这有助于组织您在数据库中创建的赠款。

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; 
相关问题