2008-10-13 34 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; 
相關問題