2016-11-18 60 views
0

現在、RazorSQLを使用してIBM DB2でクエリをテストしています。今、私は手続きを作成することに問題が残っていますDB2ストアドプロシージャSQLCODE = -440、SQLSTATE = 42884を返す

私は以下の手順を持っています。私はdb2inst1と呼ばれる管理者ユーザとしてこのプロシージャを作成します。

CREATE OR REPLACE PROCEDURE CANCEL_ACTIVITY (IN application_handle INTEGER) 
    LANGUAGE SQL 
BEGIN 
    DECLARE UOW_ID INTEGER; 
    DECLARE ACTIVITY_ID INTEGER; 

    FOR v AS cur1 CURSOR FOR 
    SELECT UOW_ID, ACTIVITY_ID FROM TABLE(SYSPROC.MON_GET_ACTIVITY(application_handle, -1)) 
    DO 
    CALL WLM_CANCEL_ACTIVITY(application_handle, v.uow_id, v.activity_id); 
    END FOR ; 
END 

さて、私は管理者ではありませんapplicationtestと呼ばれる私の通常のユーザーにログオン。私は次のことを実行する場合:

CALL CANCEL_ACTIVITY(12345) 

私は次のエラーを取得する:

DB2 SQL Error: SQLCODE=-440, SQLSTATE=42884, SQLERRMC=CANCEL_ACTIVITY;PROCEDURE, DRIVER=4.16.53 

IBMによると、それはによって引き起こされています:このquestionを見て

NO AUTHORIZED routine-type BY THE NAME routine-name HAVING COMPATIBLE ARGUMENTS WAS FOUND

、私はこのデバッグを実行しました結果が次のとおりであるため、ユーザーが同じで、同じではないと確認するコード:

| ROUTINESCHEMA 
1 | db2inst1 
2 | DB2INST1 

論理的には、ROUTINESCHEMAには正規ユーザーapplicationtestが必要ですか。

私も次のことを実行しました:

GRANT EXECUTE ON PROCEDURE CANCEL_ACTIVITY TO PUBLIC; 

それが役立つだろうかどうかを確認し、それでも、同じエラーします。

また、applicationtestを使用してプロシージャを作成しようとしましたが、期待どおり、必要な権限がありません。

EDIT:

私はちょうどDB2INST1.CANCEL_PROCEDURE(12345)指定された、そして今、私は次のエラーを取得しています:

2016-11-18 11:27:34.983 -0800 [ERROR|01c56|] :: Java::ComIbmDb2JccAm::SqlSyntaxErrorException : DB2 SQL Error: SQLCODE=-551, SQLSTATE=42501, SQLERRMC=APPLICATIONTEST;EXECUTE;DB2INST1.CANCEL_ACTIVITY, DRIVER=4.16.53 

私は、ユーザーapplicationtestが、その手順を実行する権限を持っていないことを推測?

私は2つの質問がある:

  1. それがプロシージャを呼び出す前にDB2INST1を呼び出す必要はありませんすることは可能ですか?だからCALL DB2INST1.CANCEL_ACTIVITYではなくCALL CANCEL_PROCEDURE(..)のように呼び出すことができます。

  2. applicationtestにプロシージャを呼び出すための権限を与える方法を教えてください。

答えて

1

あなたはここで二つの問題があります。

  1. ストアドプロシージャのスキーマは、プロシージャを作成したユーザーの暗黙のスキーマです。この場合、スキーマ名は 'db2inst1'です。他のユーザーである 'applicationtest'と接続すると、暗黙のスキーマはユーザーの同じ名前になります。https://www.ibm.com/support/knowledgecenter/es/SSEPGG_11.1.0/com.ibm.db2.luw.sql.ref.doc/doc/r0001016.html

  2. がschema.nameでストアドプロシージャを呼び出します:https://www.ibm.com/support/knowledgecenter/es/SSEPGG_11.1.0/com.ibm.db2.luw.sql.ref.doc/doc/r0001014.html
  3. :db2inst1.cancel_activity
  4. は、その上にはdb2inst1を含むパスを設定しdb2inst1のにスキーマを設定し

    • :次に、あなたは以下の可能性を持っています

    前の3つのオプションの間に、私は個人的に2番目のschema.nameをお勧めします。

    1. もう1つの問題は実行許可です。プロシージャを作成するときは、他のユーザー/グループに実行を許可する必要があります。この場合、db2inst1ユーザーがプロシージャーを作成しましたが、このユーザー(またはDBADM権限を持つユーザー)だけがプロシージャーを実行できます。

あなたが実行を許可する必要があり、他のユーザ()と接続されているので:

db2 grant execution on procedure db2inst1.cancel_activity to user applicationtest 
+0

こんにちは@angoca!ありがとうございます - 私は現在のパスを設定する場合は、現在のセッションと現在のユーザーのためだけですか、それともグローバルに設定されていますか?将来、 'CALL CANCEL_ACTIVITY()'を呼び出すことができますか? – theGreenCabbage

+0

設定されたパスの有効範囲は、現在のセッションの範囲です。データベースに接続するたびに、そのレジスタを変更する必要があります。 – AngocA

関連する問題