2010-03-04 12 views
8

Przede wszystkim jestem nowicjusz Oracle, więc wybacz mi, jeśli to głupie pytanie ...Wykonywanie Oracle proc przechowywanej jako inny użytkownik

mam schematu o nazwie „CODE” z przechowywanych proc, który wykonuje arbitralny SQL (na razie proszę zignorować potencjalne problemy bezpieczeństwa związane z tym). SQL, który jest przekazywany, wybierze dane; ale wszystkie dane znajdują się w schemacie A, B lub C - ale SQL wybierze tylko JEDEN schemat na raz.

Na przykład: Użytkownik typu A tworzy ciąg "SELECT * FROM A.USERTABLE" - podczas gdy użytkownik typu B tworzy ciąg "SELECT * FROM BUSESSABLE".

Co próbuję zrobić, to pozwolić użytkownikowi nie jawnie określić ich schematu. W frontowej aplikacji .net; Już wiem, czy są one typu A, B czy C. Chcę, żeby wszystkie trzy po prostu wpisały "WYBIERZ * Z NADZOROWANEGO".

Problem polega na tym, że nie wiem, jak to zrobić. Moja aplikacja może uruchamiać tylko proc w schemacie "CODE" - więc nie mogę po prostu skopiować kodu i pozwolić użytkownikowi na wywołanie "A.ExecuteSQL".

Próbowałem kilku rzeczy; ale nic nie zadziałało tak daleko. Chcę, aby proces ExecuteSQL pozostał w schemacie CODE; ale gdy "PIERWSZE" zostanie przekazane, muszę wiedzieć, że czasami oznacza to A.USERNAME, a czasami B.USERNAME.

Wszelkie sugestie?

Odpowiedz

10

Zastosowanie:

ALTER SESSION SET CURRENT_SCHEMA = schema 

To equivalent to SQL Server's EXECUTE AS syntax.

+0

Jak to działa? Pierwsza aplikacja wykonuje tę instrukcję "ALTER" lub wykonuje ją w procedurze 'CODE'? – Guru

+1

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:588045400346317188 ma więcej informacji. Wygląda na to, że możesz to zrobić za pomocą dynamicznego sql (wykonaj natychmiastowo) wewnątrz przechowywanego proc. –

+0

@Guru: Zobacz link do strony Rob P, –

7

Inną opcją byłoby użycie polecenia AUTHID CURRENT_USER.

Jeśli dodasz te dwa słowa kluczowe bezpośrednio po nazwie pakietu, procedury, funkcji lub typu, zostanie ono wykonane z uprawnieniami wykonywanego użytkownika, a nie ze schematu CODE. Przesłania to domyślne zachowanie, które jest AUTHID Definer (przywileje schematu/user że skompilowane kod)

tj

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

Zauważ, że dla funkcji i procedur poufnych opakowaniu, Pragma mogą być stosowane tylko na poziomie pakietu. Nie można ustawić uprawnień dla poszczególnych funkcji.

Powinno to spowodować, że każdy SQL wewnątrz funkcji, pakietu itp. Zostanie wykonany z uprawnieniami użytkowników.

Użyłem tego do zarządzania podobnym "rutynowym" uruchomieniem każdego starego SQL "- przynajmniej zatrzymasz" normalnego "użytkownika, który nie będzie mógł użyć swojej procedury przechowywanej, aby upuścić tabelę lub zainstaluj dodatkowy kod w schemacie CODE.

(Może być również warta - jeśli jeszcze tego nie zrobiłeś - dodanie poprawności do wyrzucenia określonych słów kluczowych - tzn. Musi zaczynać się od SELECT, nie może zawierać osadzonych bloków pl/sql - niezależnie od tego, co możesz zrobić bez łamania istniejący kod).

Powiązane problemy