Sql server 返回SQLCODE=-440、SQLSTATE=42884的DB2存储过程

Sql server 返回SQLCODE=-440、SQLSTATE=42884的DB2存储过程,sql-server,stored-procedures,db2,Sql Server,Stored Procedures,Db2,我目前正在使用RazorSQL测试IBMDB2的查询。现在,我被困在创建过程的问题上 我有以下程序。我以名为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 C

我目前正在使用RazorSQL测试IBMDB2的查询。现在,我被困在创建过程的问题上

我有以下程序。我以名为
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)
GRANT EXECUTE ON PROCEDURE CANCEL_ACTIVITY TO PUBLIC;
我得到以下错误:

DB2 SQL Error: SQLCODE=-440, SQLSTATE=42884, SQLERRMC=CANCEL_ACTIVITY;PROCEDURE, DRIVER=4.16.53
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
据调查,这是由以下原因造成的:

找不到名为例程名称且具有兼容参数的授权例程类型

看到这一点,我运行了这个调试代码来检查用户是否相同,并且看起来不一样,因为结果是:

  | ROUTINESCHEMA
1 | db2inst1
2 | DB2INST1
从逻辑上讲,
ROUTINESCHEMA
应该包含我的常规用户
applicationtest
,对吗

我甚至运行了以下程序:

CALL CANCEL_ACTIVITY(12345)
GRANT EXECUTE ON PROCEDURE CANCEL_ACTIVITY TO PUBLIC;
看看这是否有帮助,但仍然是同样的错误

我还尝试使用
applicationtest
创建过程,但正如预期的那样,我没有这样做所需的特权

编辑:

我刚刚指定了DB2INST1.CANCEL_过程(12345),现在我得到了以下错误:

DB2 SQL Error: SQLCODE=-440, SQLSTATE=42884, SQLERRMC=CANCEL_ACTIVITY;PROCEDURE, DRIVER=4.16.53
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
没有执行该过程的权限

我有两个问题:

  • 是否可以在调用过程之前不必调用DB2INST1?所以我可以这样调用它,而不是调用DB2INST1.CANCEL\u活动。我觉得这会消除很多模棱两可的地方

  • 如何授予
    applicationtest
    调用过程所需的特权


  • 这里有两个问题:

  • 存储过程的模式是创建该过程的用户的隐式模式。在本例中,架构名称为“db2inst1”。当您与其他用户“applicationtest”连接时,隐式架构与该用户的名称相同。那么您就有以下可能:

    • 将架构设置为db2inst1:
    • 使用schema.name:db2inst1.cancel\u活动调用存储过程
    • 设置路径,包括其上的db2inst1:
    在前三个选项之间,我个人建议使用第二个schema.name

  • 另一个问题是执行权限。创建过程时,必须将执行权限授予其他用户/组。在本例中,db2inst1用户创建了该过程,但只有该用户(或具有DBDM权限的人)可以执行该过程
  • 由于您正在与其他用户连接,因此必须授予执行权限():


    这里有两个问题:

  • 存储过程的模式是创建该过程的用户的隐式模式。在本例中,架构名称为“db2inst1”。当您与其他用户“applicationtest”连接时,隐式架构与该用户的名称相同。那么您就有以下可能:

    • 将架构设置为db2inst1:
    • 使用schema.name:db2inst1.cancel\u活动调用存储过程
    • 设置路径,包括其上的db2inst1:
    在前三个选项之间,我个人建议使用第二个schema.name

  • 另一个问题是执行权限。创建过程时,必须将执行权限授予其他用户/组。在本例中,db2inst1用户创建了该过程,但只有该用户(或具有DBDM权限的人)可以执行该过程
  • 由于您正在与其他用户连接,因此必须授予执行权限():


    嗨,安哥卡!谢谢--如果我设置了当前路径,那么它是仅针对当前会话和当前用户,还是全局设置的?将来,我是否可以从那时起调用
    call CANCEL\u ACTIVITY()
    ?设置路径的范围是针对当前会话的。每次连接到数据库时,都需要更改该寄存器。使用schema.name调用存储过程解决了我的问题。ThxHi@angoca!谢谢--如果我设置了当前路径,那么它是仅针对当前会话和当前用户,还是全局设置的?将来,我是否可以从那时起调用
    call CANCEL\u ACTIVITY()
    ?设置路径的范围是针对当前会话的。每次连接到数据库时,都需要更改该寄存器。使用schema.name调用存储过程解决了我的问题。谢谢