L'exécution d'une Proc Stockée Oracle comme un Autre Utilisateur
Je suis surtout un oracle novice, donc pardonnez-moi si c'est une question stupide...
J'ai un schéma appelé "CODE" avec une procédure stockée qui exécute des requêtes SQL (pour l'instant, s'il vous plaît ignorer les problèmes de sécurité potentiels associés avec que). Le SQL qui est passé dans la volonté de sélectionner des données; mais toutes les données réside dans le schéma A, B, ou C, mais le SQL ne jamais sélectionner à partir d'UN schéma à un moment.
Par exemple: Utilisateur de type A crée une chaîne de caractères 'SELECT * from A. USERTABLE" - tout utilisateur de type B crée une chaîne de caractères 'SELECT * from B. USERTABLE'.
Ce que je suis en train de faire est de permettre à l'utilisateur de ne pas spécifier de manière explicite leur schéma. Dans le front-end .net application; je sais déjà que si elles sont de type A, B ou C. je veux tous les trois à entrer simplement 'SELECT * from USERTABLE'.
Le problème que je rencontre est que je ne sais pas comment faire. Mon application ne peut exécuter proc dans le "CODE" du schéma, donc je ne peux pas dupliquer le code et permettre à l'utilisateur d'Un appel 'A. ExecuteSQL'.
J'ai essayé quelques petites choses; mais rien n'a fonctionné jusqu'à présent. Je veux le ExecuteSQL proc pour rester dans le CODE de schéma; mais quand 'USERTABLE' est transmis, j'ai besoin de savoir que, parfois, cela signifie que A. nom d'utilisateur et parfois, B. nom d'utilisateur.
Des suggestions?
OriginalL'auteur Rob P. | 2010-03-04
Vous devez vous connecter pour publier un commentaire.
Utilisation:
Qui est le l'équivalent de SQL Server
EXECUTE
syntaxe.ALTER
déclaration ou de l'exécution de cette procédureCODE
?asktom.oracle.com/pls/asktom/... a quelques infos. Il semble que vous pouvez le faire avec le sql dynamique (à l'exécution immédiate) à l'intérieur de votre procédure stockée.
Voir Rob P AskTom lien
Merci OMG. Il devrait fonctionner. Je sais que vous devez utiliser
EXECUTE IMMEDIATE
au sein de PL/SQL. Mais était sceptique, comment cela va changer quand il a commencé l'exécution et de la modification à un autre schéma de milieu de que la. Ont de les vérifier.OriginalL'auteur OMG Ponies
Une autre option serait d'utiliser le AUTHID CURRENT_USER pragma.
Si vous ajoutez ces deux mots clés, immédiatement après que votre paquet, une procédure, une fonction ou le type de nom, il s'exécute avec les privilèges de l'utilisateur exécutant, plutôt que le CODE de schéma. Il remplace le comportement par défaut qui est AUTHID DEFINER (les privilèges du schéma/utilisateur qui a compilé le code)
c'est à dire
Noter que pour les fonctions et les procédures d'initié d'un package, le pragma ne peut être appliquée au niveau du package. Vous ne pouvez pas définir les droits de chaque fonction de base.
Ce qui devrait entraîner SQL à l'intérieur de la fonction, l'emballage, etc, à exécuter avec les privilèges aux utilisateurs.
Je l'ai utilisé que pour gérer une semblable "exécuter n'importe quel vieux bits de SQL dynamiquement' de routine - à tout le moins vous avez arrêté un niveau "normal" de l'utilisateur d'être en mesure d'utiliser votre procédure stockée pour supprimer une table ou d'installer d'autres code dans le CODE de schéma.
(Il peut également être utile si vous ne l'avez pas déjà - ajout de la validation de certains de jeter certains mots - clés, c'est à dire doit commencer par SÉLECTIONNER, ne doit pas contenir intégré pl/sql blocs - ce que vous pouvez sortir avec sans casser le code existant).
OriginalL'auteur JulesLt