2016-10-20 4 views
2

ユーザーAにプロシージャを作成して、セッション・ユーザー(プロシージャを実行したことがあるユーザー)に属するテーブルのリストを取得し、テーブルに挿入しました。しかし、私はユーザーBからプロシージャを実行します。値を取得していない、私はsession_user値がプロシージャに渡されていないことを意味する?? I enter code hereこれは予想どおりの動作ですか?プロシージャの実行中に実際にセッションのユーザーを渡さずにセッションユーザーに渡す方法はありますか(それはそれ自体で必要です)?プロシージャにセッションのユーザー値を渡します。

表:私が実行しようとしています

CREATE TABLE "ABCD" 
    ( "USERNAME" VARCHAR2(1`enter code here`00 BYTE), 
    "TABLE_NAME" VARCHAR2(100 BYTE)) ; 

が手順:

CREATE OR REPLACE PROCEDURE "SESS_USR_OBJECTS" AS 
V_USER varchar2(50):= SYS_CONTEXT('USERENV','SESSION_USER'); 
cursor SEL_CUR is select OWNER,TABLE_NAME from all_tables where owner in (V_USER); 
SEL_REC SEL_CUR%ROWTYPE; 
VSQL1 VARCHAR2(100); 

BEGIN 
OPEN SEL_CUR; 
LOOP 
FETCH SEL_CUR INTO SEL_REC; 
EXIT WHEN SEL_CUR%NOTFOUND; 

VSQL1:= 'insert into ABCD VALUES ('''||SEL_REC.OWNER||''','''||SEL_REC.TABLE_NAME||''')'; 
Dbms_Output.Put_Line(VSQL1); 
EXECUTE IMMEDIATE VSQL1; 
COMMIT; 

END LOOP; 
CLOSE SEL_CUR; 
END; 


When I runt the procedure nothing is being inserted into table. 
Yes, user B has access to run the procedure in A. 

答えて

1

あなたはSCHEMAIDによってフィルタリングされた図であり、ALL_TABLESから選択し、他の(内部されています)表現は、現在のユーザではなく、SESSION_USERです。そのため、プロシージャを実行すると、ユーザー "A"が見ることができるが、ユーザー "B"が所有する表のリストから選択しています。どうやら、そのリストはあなたのデータベースでは空です。

この作品にあなたが望む方法を作成するには、あなたがこのように、その手続き上で実行者権限を使用する必要があります。

CREATE OR REPLACE PROCEDURE "SESS_USR_OBJECTS" AUTHID CURRENT_USER AS... 

そのように、それが実行されるとき、それは利用者「B」の中から選択しますALL_TABLESのバージョン。

+0

Matthewに感謝、あなたのトリックが働いた。 –

+0

私はそれを「トリック」として特徴づけることはできませんが、歓迎します:)あなたの質問に最もよく答えると感じたら私の答えを受け入れることを検討してください。 –

+0

真の "トリック"ではありません。私はここでより多くの情報を見つけました:http://www.dba-oracle.com/t_authid_current_user.htm –

関連する問題