2017-05-11 6 views
0

この作業を実行して、この表に多数の行があります。PL/SQLでは、手動で問合せ内の権限が不十分です

この表には2つの列があります:私はPKとしてFOOを持っていると私はそれらの値を知っている

FOOBAR

を、彼らは両方の数字ですが、私はバーで任意の値を持っていません。

問題なくすべてのクエリを手動で実行できますが、このPL/SQLを作成して、別のクエリでBAR値を見つける必要があると問題なく自動的に実行されます。

create or replace procedure FxB_pro 
IS 
    tmpFIELD NUMBER := 0; 
    i NUMBER := 0; 
    cursor c1 is 
    SELECT * FROM FooXBar WHERE BAR IS NULL; 
BEGIN 

    FOR CTUpdate IN c1 
    LOOP 
    BEGIN 
     SELECT t5.bar INTO tmpFIELD FROM table_1 t1, table_2 t2, table_3 t3, table_4 t4, table_5 t5, table_6 t6 
     where t1.fielda_id = t2.fielda_id 
     and t2.fielda_id = t3.fielda_id 
     and t3.fieldb_id = t4.fieldb_id 
     and t3.fieldb_id = t6.fieldb_id 
     and t4.fieldd_id = t5.fieldc_id 
     and t1.fieldc = CTUpdate.FOO 
     and rownum = 1; 
    EXCEPTION 
     WHEN NO_DATA_FOUND THEN 
     tmpFIELD :=null; 
    END; 

    UPDATE FooXBar set BAR = tmpFIELD where FOO=CTUpdate.FOO; 

    i := i+1; 

    IF mod(i, 1000) = 0 THEN -- Commit every 1000 records 
     COMMIT; 
    END IF; 

    END LOOP; 
    COMMIT; 
END; 

私はきちんとテスト環境 PL/SQLが作成され、実行中でこれをテストしてみたが、私は生産にそれを実行するつもりだとき、私は選択ウィッヒでこのエラーが入れていますtmpFIELDの値:

Erro(12,11): PL/SQL: SQL Statement ignored 
Erro(12,143): PL/SQL: ORA-01031: insufficient privileges 

私はなぜこれが起こっていることは理解できない、誰かが私を助けてくださいことができますか?

+0

エラーは非常に明確です。本番環境では権限がありません。これらのテーブルを読み取る権限がありません(ローカル変数に割り当てる特権はありません)。デフォルトでは、権限は「定義者」(プロシージャを作成したユーザー)の権限です。プロシージャを起動者の特権で実行させることもできます(必要な場合はそのドキュメントを参照してください)。 https://docs.oracle.com/cd/E21901_01/timesten.1122/e21639/accesscntl.htm#TTPLS273 – mathguy

+0

DBでadm userを使用していても、個別にクエリを実行できますか?私は今、おかげです。私はこれを検索します。 – Imkls

答えて

2

権限はROLEを介して割り当てられます。 これは直接SQLでは問題ありませんが、PL/SQLでは動作しません。

ユーザーに直接権限を付与する必要があります。

set role none; 

あらかじめ設定PL/SQLクエリをテストするが、これはROLE介して取得したpriviledgesを無効にし、PL/SQLで実行されている可能性のある問題が表示されます。

+1

ありがとう、私はロールがPL/SQLで動作しないことを知らなかった。 – Imkls

+0

ロールも使用できますが、ロールには 'WITH GRANT OPTION'が必要です。プロシージャはテーブルにアクセスするので、実際には意味がありますが、プロシージャへのアクセスを他のユーザに許可することができます。したがって、テーブルに間接的にアクセスできます。 –

関連する問題