2016-07-14 28 views
-1

Ich habe eine Frage zur Verwendung von Datenbank-Links in Oracle PL/SQL. Angenommen, ich habe einen Datenbanklink (Database2) in meiner aktuellen Datenbank erstellt und verwende ihn, um auf eine zweite Datenbank zuzugreifen. Zum Beispiel:Oracle-Datenbank-Links zum Gewähren/Widerrufen von Rollen

select *from [email protected]; 

Update [email protected] 
set Comment = 'Hello world!' 
where CustomerID = 123; 

Dies alles funktioniert erfolgreich.

Aber sagen wir mal, ich möchte Rollen von einem Benutzer in Database2 gewähren oder entziehen. Kann das über meinen Datenbanklink gemacht werden? Wenn ja, wie lautet die Syntax?

Wenn ich eine PL/SQL-Sitzung in Database2 öffnen, dann würde die Syntax sein:

REVOKE some_role FROM bsmith; 

GRANT some_other_role TO rjones; 

Gibt es eine Möglichkeit, dies von meiner ursprünglichen Datenbank zu tun, um meine Datenbank-Link verwenden?

+0

Warum wollen würden Sie DDL über die Datenbank-Link zu tun? Das ist generell nicht erlaubt und ist generell eine schlechte Idee. Sie können eine gespeicherte Prozedur in Database2 erstellen, die die gewünschte DDL ausführt und dann dem Datenbankverbindungsbenutzer den Ausführungszugriff für diese Prozedur gewähren. Oder Sie könnten wirklich knifflig werden und einen Job planen, der auf Datenbank2 läuft, der die Grants tatsächlich ausführt, aber das ist eine ziemlich komplizierte Architektur. –

+0

Ich schreibe eine gespeicherte Prozedur, die bestimmte Datensätze und Berechtigungen aus meiner Produktionsdatenbank nimmt und sie entweder in meine Entwicklungs- oder Testdatenbank kopiert. Ich kann die Datensätze problemlos kopieren, aber die Berechtigungen zu vergeben, erweist sich als sehr viel schwieriger. – MrMike

Antwort

0

Sie können einen DB Link tun DDL über auf der entfernten Datenbank die DBMS_SQL Paket durch den Aufruf:

declare 
v_cursor NUMBER; 
v_ind  number; 
v_ret  varchar2(2000); 
BEGIN 
    v_cursor := [email protected]; 
    [email protected](v_cursor, 'create sequence xyz_seq', dbms_sql.native); 
    v_ind := [email protected](v_cursor); 
end; 
/
+0

Gute Idee. Danke, Gary. – MrMike

+0

Oder '[email protected]()' könnte einfacher sein (ungetestet, aber ich erinnere mich schwach daran, das vor 20 Jahren zu verwenden). –