2016-11-18 263 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,它是由引起:

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

望着這question,我跑這個調試代碼來檢查用戶是否相同,並且它看起來不是相同的,因爲結果是:

| ROUTINESCHEMA 
1 | db2inst1 
2 | DB2INST1 

邏輯上,ROUTINESCHEMA應該有我的普通用戶applicationtest在裏面吧?

我甚至跑了以下內容:

GRANT EXECUTE ON PROCEDURE CANCEL_ACTIVITY TO PUBLIC; 

要看看它是否會有所幫助,但儘管如此,同樣的錯誤。

我也嘗試使用applicationtest創建過程,但正如所料,我沒有這樣做的權限。

編輯:

我剛纔指定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沒有權限來執行該程序?

我有兩個問題:

  1. 是否有可能不具有調用程序之前調用DB2INST1?所以我可以把它叫做CALL CANCEL_PROCEDURE(..)而不是CALL DB2INST1.CANCEL_ACTIVITY。我覺得這樣會消除很多不明確之處。

  2. 我該如何授予applicationtest調用該過程所需的特權?

回答

1

您這裏有兩個問題:

  1. 存儲過程的模式是創建過程的用戶的隱式模式。在這種情況下,模式名稱是'db2inst1'。當您與其他用戶「applicationtest」連接時,隱式模式與用戶名稱相同。然後,你有以下幾種可能:

    之間,前面三個選項,我個人推薦第二個schema.name。

    1. 另一個問題是執行權限。當您創建一個過程時,您必須將執行授予其他用戶/組。在這種情況下,db2inst1用戶創建了該過程,但只有該用戶(或具有DBADM權限的人員)才能執行該過程。

因爲你與你有權授予執行其他用戶()連接:

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

@angoca嗨!謝謝 - 如果我設置當前路徑,是僅針對當前會話還是當前用戶,還是全局設置?將來,我可以從那以後調用'CALL CANCEL_ACTIVITY()'嗎? – theGreenCabbage

+0

設置路徑的範圍適用於當前會話。每次連接到數據庫時,都需要更改該寄存器。 – AngocA