【问题标题】:Db2 trigger referencing same table on which this before insert trigger is createdDb2 触发器引用了在其上创建 this before insert 触发器的同一个表
【发布时间】:2021-04-21 02:34:50
【问题描述】:

在 Db2 版本 10.x 中,我在表 TEST 上创建了一个插入前触发器

CREATE OR REPLACE TRIGGER TRG_TEST_INSERT
 BEFORE INSERT ON TEST 
 REFERENCING NEW AS OBJ
 FOR EACH ROW MODE DB2SQL
 WHEN (((SELECT CheckCount('SELECT count(1) FROM TEST') FROM SYSIBM.SYSDUMMY1)));

还有这个功能:

--FUNCTION
CREATE OR REPLACE FUNCTION CheckCount(query varchar(1000)) 
RETURNS INTEGER
LANGUAGE SQL 
 dfl:BEGIN 
 DECLARE id INTEGER;

DECLARE cur CURSOR for st1;
 PREPARE st1 FROM query;
 open cur;
 fetch from cur into id;
 return id;
 close cur;
END dfl*/

我正在调用 udf 来检查同一张桌子上的计数。但是我遇到了错误 SQLCODE=-746, SQLSTATE=57053

SQL0746N 名为“”的例程(特定名称 "") 失败,因为例程违反了嵌套 SQL 尝试执行操作“”时的语句规则 在名为“”的桌子上。

解释:

当应用程序调用一个例程时返回此消息 尝试以与其他用途冲突的方式访问表 由应用程序或直接调用的例程或 间接来自该应用程序。

因为我的前触发器在同一张桌子上。如何在不遇到此类错误的情况下检查计数?

【问题讨论】:

  • 您的问题是什么?您描述了您所做的以及(预期的)错误。
  • 我的问题是如何克服这个错误。或使用此 UDF 检查计数的实现
  • 我添加了那个问题。
  • 您是否尝试将其内联到触发器本身?
  • 是的内联工作。但我还有一些其他功能要执行,只能使用函数来完成

标签: triggers db2 user-defined-functions


【解决方案1】:

了解Data conflicts when procedures read from or write to tables
您可以将您的函数逻辑重写为 SP 调用:

CREATE OR REPLACE PROCEDURE CheckCount(query varchar(1000), out cnt int) 
LANGUAGE SQL 
BEGIN
  PREPARE S1 FROM 'SET ? = (' || query || ')';
  EXECUTE S1 INTO cnt;
END@

并在您的触发器中使用它,如下所示:

 CREATE OR REPLACE TRIGGER TRG_TEST_INSERT
 BEFORE INSERT ON TEST 
 REFERENCING NEW AS OBJ
 FOR EACH ROW MODE DB2SQL
 BEGIN
   DECLARE V_CNT INT;
   --SET V_CNT = CHECKCOUNT('SELECT count(1) FROM TEST5');
   CALL CHECKCOUNT('SELECT count(1) FROM TEST', V_CNT);
   IF <some expressin with V_CNT>
   THEN
     ...
   END IF;   
 END
 @

如果您仍然收到SQL0746N(我手头没有 10.x 并且不记得,如果需要),请尝试以实例所有者(Linux、Unix)的身份在服务器上运行以下命令或描述中建议的本地管理员 (Windows),然后重新创建例程和触发器:

db2set DB2_RESOLVE_CALL_CONFLICT=YES -immediate

【讨论】:

  • 我可以用 UDF 代替 SP 吗?
  • 不,您不能使用 UDF 代替 SP 来使其工作。
  • 这对您有帮助,谢谢!!
  • 您能否解决我的疑问,为什么 UDF 不起作用但 SP 起作用?
  • 我不知道。大概就是这样的设计。您可能会在查询中多次使用一个函数,并且可能很难用它们获得正确的结果。 IBM 可能会拼命阻止您做这些危险的事情,以避免进一步可能出现的烦人问题,例如“为什么我期待这个,但得到了那个?”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-04
  • 2021-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-23
相关资源
最近更新 更多