Ich bin meistens ein Orakel-Novize, also vergib mir, wenn das eine dumme Frage ist ...
Ich habe ein Schema mit dem Namen 'CODE' mit einem gespeicherten Prozess, der beliebiges SQL ausführt (ignorieren Sie vorerst die damit verbundenen potenziellen Sicherheitsprobleme). Die SQL, die übergeben wird, wählt Daten aus; Alle Daten befinden sich jedoch entweder in Schema A, B oder C - aber die SQL wählt immer nur ein Schema aus.
Beispiel: Benutzer vom Typ A erstellt eine Zeichenfolge 'SELECT * FROM A.USERTABLE' - während Benutzer des Typs B eine Zeichenfolge 'SELECT * FROM B.USERTABLE' erstellt.
Was ich versuche, ist, dass der Benutzer sein Schema nicht explizit angeben darf. In der Front-End-.net-Anwendung; Ich weiß bereits, ob sie vom Typ A, B oder C sind. Ich möchte alle drei einfach 'SELECT * FROM USERTABLE' eingeben.
Das Problem, das ich habe, ist, dass ich nicht weiß, wie ich das machen soll. Meine App kann proc nur im 'CODE'-Schema ausführen - also kann ich den Code nicht einfach duplizieren und Benutzer A' A.ExecuteSQL 'aufrufen lassen.
Ich habe ein paar Dinge ausprobiert; aber bisher hat noch nichts funktioniert. Ich möchte, dass der ExecuteSQL-Prozess im CODE-Schema bleibt. aber wenn 'USERTABLE' übergeben wird, muss ich wissen, dass das manchmal A.USERNAME und manchmal B.USERNAME bedeutet.
Irgendwelche Vorschläge?
Verwenden:
%Vor% Das ist die Entsprechung zur EXECUTE AS
-Syntax von SQL Server .
Eine andere Option wäre das AUTHID CURRENT_USER-Pragma.
Wenn Sie diese beiden Schlüsselwörter unmittelbar nach Ihrem Paket-, Prozedur-, Funktions- oder Typnamen hinzufügen, wird sie mit den Berechtigungen des ausführenden Benutzers und nicht mit dem CODE-Schema ausgeführt. Dies überschreibt das Standardverhalten, das AUTHID DEFINER ist (die Berechtigungen des Schemas / Benutzers, der den Code kompiliert hat)
d. h.
%Vor%Beachten Sie, dass das Pragma für Funktionen und Prozeduren, die in einem Paket enthalten sind, nur auf Paketebene angewendet werden kann. Sie können die Rechte nicht pro Funktion festlegen.
Dies sollte dazu führen, dass SQL innerhalb der Funktion, des Pakets usw. mit den Benutzerberechtigungen ausgeführt wird.
Ich habe das verwendet, um eine ähnliche Routine zu verwalten, die ein altes Bit von SQL dynamisch ausführt. Zumindest haben Sie einen normalen Benutzer daran gehindert, Ihre gespeicherte Prozedur zum Löschen einer Tabelle oder Installation zu verwenden zusätzlicher Code im CODE-Schema.
(Es kann auch sinnvoll sein - wenn Sie noch nicht - einige Validierung hinzufügen, um bestimmte Schlüsselwörter zu werfen - dh muss mit SELECT beginnen, darf keine eingebetteten pl / sql Blöcke enthalten - was auch immer Sie bekommen können, ohne zu brechen Code).