【问题标题】:DB2 Stored Procedure Returning SQLCODE=-440, SQLSTATE=42884DB2 存储过程返回 SQLCODE=-440, SQLSTATE=42884
【发布时间】:2017-04-02 17:43:06
【问题描述】:

我目前正在使用 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,是由于:

没有通过名称获得授权的例程类型例程名称有兼容的参数被发现

看着这个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 调用过程所需的权限?

【问题讨论】:

    标签: sql-server stored-procedures db2


    【解决方案1】:

    这里有两个问题:

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

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

      1. 另一个问题是执行权限。创建过程时,您必须将执行权限授予其他用户/组。在这种情况下,db2inst1 用户创建了该过程,但只有该用户(或具有 DBADM 权限的人)可以执行它。

    因为您正在与其他用户连接,所以您必须授予执行权限 (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
    

    【讨论】:

    • 嗨@angoca!谢谢——如果我设置了当前路径,是只针对当前会话和当前用户,还是全局设置?以后我能不能只打电话给CALL CANCEL_ACTIVITY()
    • 设置路径的范围是针对当前会话的。每次连接到数据库时,都需要更改该寄存器。
    • 使用 schema.name 调用存储过程解决了我的问题。谢谢
    猜你喜欢
    • 2013-08-24
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多