Ausführen einer Gespeicherten Oracle-Proc als ein Anderer Benutzer
Bin ich meistens einer oracle-Neuling, also verzeiht mir, wenn dies eine dumme Frage...
Habe ich ein schema mit dem Namen 'CODE' mit eine gespeicherte Prozedur, die ausgeführt wird, beliebige SQL (für den Moment ignorieren Sie bitte die potenziellen Sicherheits-Probleme, die im Zusammenhang mit, dass). Der SQL-Code übergeben wird, wählen Sie "Daten"; sondern alle Daten befinden sich entweder in der schema A, B oder C - aber die SQL wählen Sie immer nur von EINEM schema zu einem Zeitpunkt.
Beispiel: der Benutzer des Typs a erstellt Eine Zeichenfolge 'SELECT * FROM A. USERTABLE' -, während Nutzer vom Typ B erstellt einen string "SELECT * FROM B. USERTABLE'.
Was ich versuche zu tun, ist, dem Benutzer zu ermöglichen, die nicht explizit angeben, Ihr schema. In der front-end .net-Anwendung; ich schon wissen, ob Sie Typ A, B, oder C. ich möchte, dass alle drei einfach eingeben 'SELECT * FROM USERTABLE'.
Das problem das ich habe ist, dass ich nicht weiß, wie das geht. Meine app kann nur ausgeführt werden proc-im 'CODE' - schema - ich kann also nicht einfach den code duplizieren und lassen Sie Benutzer Ein Aufruf von 'A. ExecuteSQL'.
Habe ich versucht, ein paar Dinge, aber nichts hat geklappt so weit. Ich will die ExecuteSQL-proc, um zu bleiben in dem CODE-schema; aber wenn 'USERTABLE' übergeben bekommt, ich brauche es, zu wissen, dass manchmal das bedeutet, dass A. BENUTZERNAME und manchmal B. USERNAME.
Irgendwelche Vorschläge?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden:
Ist die äquivalent zu SQL-Servers
AUSFÜHREN ALS
- syntax.ALTER
Anweisung oder führen Sie diese in VerfahrenCODE
?EXECUTE IMMEDIATE
innerhalb von PL/SQL. Aber war skeptisch, wie das wird sich ändern, wenn es begann, ausführen und ändern Sie zu einem anderen schema in der Mitte des. Haben, Sie heraus zu überprüfen.Andere Möglichkeit wäre mit der AUTHID CURRENT_USER-pragma.
Wenn Sie fügen Sie diese zwei keywords sofort, nachdem Ihr Paket, Prozedur, Funktion oder Namen eingeben, wird ausgeführt, dass mit den Privilegien des ausführenden Benutzers, statt den CODE-schema. Dies überschreibt die default-Verhalten, das ist AUTHID DEFINER (die Privilegien, die das schema/user kompiliert den code)
d.h.
Beachten Sie, dass für Funktionen und Prozeduren insider-Paket, das pragma kann nur angewendet werden auf die Paket-Ebene. Sie können die Rechte auf einer pro-Funktion basis.
Dadurch sollte jedes SQL in der Funktion, Paket, etc, zur Abwicklung mit dem Nutzer Berechtigungen.
Habe ich verwendet, um zu verwalten, die eine ähnliche "laufen alle alten bit-SQL dynamisch" routine - zumindest haben Sie aufgehört, ein "normaler" Benutzer kann die Verwendung der gespeicherten Prozedur zum löschen einer Tabelle oder installieren Sie zusätzlichen code in das code-schema.
(Es kann sich auch lohnen - wenn Sie nicht bereits haben - Sie, einige Validierung zu werfen, die bestimmte Schlüsselwörter, d.h. Sie müssen starten, mit SELECT, darf nicht enthalten eingebettete pl/sql-Blöcke - was auch immer Sie bekommen kann Weg mit, ohne zu brechen bestehenden code).