我目前正在使用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
无权执行该程序?
我有两个问题:
是否可以在调用过程之前不必调用DB2INST1?所以我可以像CALL CANCEL_PROCEDURE(..)
而不是CALL DB2INST1.CANCEL_ACTIVITY
这样称呼它。我觉得这会消除很多歧义..
如何授予applicationtest
调用该过程所需的权限?
答案 0 :(得分:1)
这里有两个问题:
存储过程的模式是创建过程的用户的隐式模式。在这种情况下,模式名称为“db2inst1”。当您与其他用户“applicationtest”连接时,隐式模式与用户的名称相同。然后你有以下可能性:
之间,前三个选项,我个人推荐第二个schema.name。
因为您要与其他用户建立连接,您必须授予执行权(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