2010-03-04 6 views
8

Je suis la plupart du temps un novice oracle, alors pardonnez-moi si cela est une question stupide ...Exécution d'un Oracle stocké Proc comme un autre utilisateur

J'ai un schéma appelé « CODE » avec une procédure stockée qui exécute arbitraire SQL (pour l'instant, veuillez ignorer les problèmes de sécurité potentiels associés à cela). Le code SQL transmis permet de sélectionner des données; mais toutes les données résident dans le schéma A, B ou C, mais le SQL ne sélectionne jamais qu'un seul schéma à la fois. Par exemple: L'utilisateur de type A crée une chaîne 'SELECT * FROM A.USERTABLE' - tandis que l'utilisateur de type B crée une chaîne 'SELECT * FROM B.USERTABLE'.

Ce que j'essaie de faire est de permettre à l'utilisateur de ne pas spécifier explicitement son schéma. Dans l'application .net front-end; Je sais déjà s'ils sont de type A, B ou C. Je veux que tous les trois entrent simplement 'SELECT * FROM USERTABLE'.

Le problème que j'ai est que je ne sais pas comment faire cela. Mon application ne peut exécuter proc que dans le schéma 'CODE' - donc je ne peux pas simplement dupliquer le code et laisser l'utilisateur A appeler 'A.ExecuteSQL'.

J'ai essayé quelques petites choses; mais rien n'a fonctionné jusqu'ici. Je veux que le processus ExecuteSQL reste dans le schéma CODE; mais quand 'USERTABLE' est passé, j'en ai besoin pour savoir que cela signifie parfois A.USERNAME et parfois B.USERNAME.

Des suggestions?

Répondre

10

Utilisation:

ALTER SESSION SET CURRENT_SCHEMA = schema 

C'est le equivalent to SQL Server's EXECUTE AS syntax.

+0

Comment ça marche? La première application exécute cette instruction 'ALTER' ou l'exécute dans la procédure' CODE'? – Guru

+1

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:588045400346317188 a quelques informations supplémentaires. Il semble que vous pouvez le faire avec SQL dynamique (exécution immédiate) à l'intérieur de votre proc stocké. –

+0

@Guru: Voir le lien AskTom de Rob P –

7

Une autre option utiliserait le pragma AUTHID CURRENT_USER.

Si vous ajoutez ces deux mots-clés immédiatement après le nom du paquet, de la procédure, de la fonction ou du type, ils s'exécuteront avec les privilèges de l'utilisateur exécutant, plutôt qu'avec le schéma CODE. Ceci remplace le comportement par défaut qui est AUTHID DEFINER (les privilèges du schéma/utilisateur qui a compilé le code)

-à-dire

CREATE FUNCTION examplefunc 
    (pSqlStatement IN VARCHAR2) 
RETURN INTEGER 
    AUTHID CURRENT_USER 
AS 
    lResult INTEGER; 
BEGIN 
    EXECUTE IMMEDIATE pSqlStatement INTO lResult; 
    RETURN lResult; 
END examplefunc; 

Notez que pour initié des fonctions et des procédures d'un paquet, le pragma ne peut être appliquée au niveau du paquet. Vous ne pouvez pas définir les droits par fonction.

Cela devrait provoquer l'exécution de tout SQL à l'intérieur de la fonction, du paquet, etc., avec les privilèges de l'utilisateur. Je l'ai utilisé pour gérer une routine similaire 'Exécuter n'importe quel ancien bit de SQL dynamique' - à tout le moins, vous avez empêché un utilisateur 'normal' d'utiliser votre procédure stockée pour déposer une table ou installez du code supplémentaire dans le schéma CODE.

(Si vous ne l'avez pas déjà fait, ajoutez une validation pour lancer certains mots-clés - à savoir doit commencer par SELECT, ne pas contenir de blocs pl/sql intégrés - tout ce que vous pouvez faire sans casser code existant).

Questions connexes