DB2存储过程返回SQLCODE = -440,SQLSTATE = 42884

时间:2016-11-18 19:13:28

标签: sql-server stored-procedures db2

我目前正在使用RazorSQL来测试IBM DB2的查询。现在,我遇到了创建程序的问题

我有以下程序。我以名为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例程类型名称常规名称已找到具有相容性的论据

查看此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 个答案:

答案 0 :(得分:1)

这里有两个问题:

  1. 存储过程的模式是创建过程的用户的隐式模式。在这种情况下,模式名称为“db2inst1”。当您与其他用户“applicationtest”连接时,隐式模式与用户的名称相同。然后你有以下可能性:

    之间,前三个选项,我个人推荐第二个schema.name。

    1. 另一个问题是执行权限。创建过程时,必须将执行授予其他用户/组。在这种情况下,db2inst1用户创建了该过程,但只有该用户(或具有DBADM权限的用户)才能执行该过程。
  2. 因为您要与其他用户建立连接,您必须授予执行权(https://www.ibm.com/support/knowledgecenter/es/SSEPGG_11.1.0/com.ibm.db2.luw.sql.ref.doc/doc/r0007699.html):

    db2 grant execution on procedure db2inst1.cancel_activity to user applicationtest