2008-10-13 6 views
13

Ich habe zwei Benutzer Bob und Alice in Oracle, beide erstellt, indem Sie die folgenden Befehle als sysdba von sqlplus ausgeführt wird:korrekte Art und Weise Benutzer Zugriff auf zusätzliche Schemata in Oracle geben

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

ich Bob möchte vollständigen Zugang haben zu Alice Schema (das heißt, alle Tabellen), aber ich bin mir nicht sicher, welche Grant zu laufen, und ob es als sysdba oder als Alice ausgeführt werden soll.

Wir freuen uns auch über gute Hinweise auf Referenzmaterial - anscheinend keine gute Antwort aus dem Internet oder der "Oracle Database 10g The Complete Reference", die darauf sitzt mein Schreibtisch.

Antwort

20

AFAIK müssen Sie die Bewilligungen Objekt eins nach dem anderen tun.

Normalerweise würden Sie ein Skript verwenden, dieses, etwas entlang der Linien zu tun:

SELECT 'GRANT ALL ON '||table_name||' TO BOB;' 
FROM ALL_TABLES 
WHERE OWNER = 'ALICE'; 

Und ähnlich für andere db Objekte.

Sie könnten ein Paket in jedes Schema einfügen, das Sie benötigen, um den Zuschuss auszugeben, von dem aus alle GRANT-Anweisungen über EXECUTE IMMEDIATE aufgerufen werden.

z.B.

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

Es gibt viele Dinge zu beachten. Wenn Sie Zugriff sagen, möchten Sie den Tabellen den Namen des anderen Benutzers voranstellen? Sie können öffentliche Synonyme verwenden, damit Sie den ursprünglichen Besitzer ausblenden können, wenn dies ein Problem ist. Und dann gewähren Sie privs auf dem Synonym.

Sie möchten auch so gut wie möglich im Voraus planen. Möchtest du später, dass Frank auch auf Alices Schema zugreifen kann? Sie möchten keine Privilegien für die N Anzahl von Tabellen neu vergeben. Die Verwendung einer Datenbankrolle wäre eine bessere Lösung. Erteilen Sie beispielsweise die Auswahl an die Rolle "ALICE_TABLES", und wenn ein anderer Benutzer Zugriff benötigt, erteilen Sie ihm nur die Berechtigung für die Rolle. Dies hilft, die von Ihnen in der Datenbank vorgenommenen Finanzhilfen zu organisieren.

6

Eine andere Lösung, wenn Sie unterschiedliche Eigentümer haben:

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;