运行触发器时出错

Posted

技术标签:

【中文标题】运行触发器时出错【英文标题】:Error when running trigger 【发布时间】:2013-10-02 13:28:41 【问题描述】:

创建了以下触发器以将资产标签移动到正确的字段。

但得到一个错误。不是数据库专家。

CREATE TRIGGER HARRISOP.ASSET_TAG INSTEAD OF  INSERT  ON DB2ADMIN.SNMPSYS FOR EACH                                                                                STATEMENT MODE DB2SQL 
   SELECT * 
   FROM DB2ADMIN.SNMPSYS AS SNMPSYS
   WHERE SNMPSYS.SYSCONTACT_X = ' A330637'
   INSERT INTO DB2ADMIN.CITEMPLATE (ASSETTAG_X)
   VALUES (DEFAULT)

根据用户帮助的新代码。还是不行。

CONNECT TO CMDB;
CREATE TRIGGER DB2ADMIN.ASSET_TAG NO CASCADE BEFORE  INSERT  ON DB2ADMIN.SNMPSYS  FOR EACH ROW  MODE DB2SQL 
REFERENCING 
    NEW AS N
FOR EACH ROW 
MODE DB2SQL
SET N.ASSETTAG_X = SUBSTR(
  N.SYSCONTACT_X, 
  1, 
  LOCATE(',', N.SYSCONTACT_X) - 1
);
CONNECT RESET;

【问题讨论】:

我真的只想在一个字段中抓取所有内容,直到 , 。 Tivoli 正在获取 SNMP 信息并将其放在位置字段中。前任。 A12345567,安大略省渥太华。我们有大量不同外观的资产,所以我只需将所有字符移到 , 移到另一个字段。再次没有数据库人员,因此将不胜感激。使用 DB2 数据库。 触发器本身和插入语句的语法都不正确。我也没有在您的 SQL 中看到任何逗号或位置字段。请用人类的语言解释你想要达到的目标。 我有一个名为 syscontact_x 的 snmp 字段。我需要将一些数据移出并移入正确的字段调用assettag_x。资产标签和当前位置文本类似于此示例。 A12345567,安大略省渥太华。我需要将 A1234567 移动到正确的字段。我想创建一个触发器,该触发器在该字段上发生插入或更新并移动数据时触发。我正在使用 DB2 并使用其内置的 SQL 辅助来创建触发器,这就是它想出的。我找不到更手动的方法来做到这一点。希望能回答你的问题。谢谢 看起来我已经完成了部分工作。只需要实际移动所选数据的帮助。连接到 CMDB; CREATE TRIGGER DB2ADMIN.ASSET_TAG NO CASCADE BEFORE INSERT ON DB2ADMIN.SNMPSYS FOR EACH ROW MODE DB2SQL SELECT SNMPSYS.SYSCONTACT_X FROM DB2ADMIN.SNMPSYS AS SNMPSYS WHERE SNMPSYS.SYSCONTACT_X LIKE '%,' 【参考方案1】:

如果我正确理解你想要什么,触发器应该看起来像

CREATE TRIGGER HARRISOP.ASSET_TAG 
BEFORE INSERT   
ON DB2ADMIN.SNMPSYS 
REFERENCING NEW AS N
FOR EACH ROW 
SET N.ASSETTAG_X = SUBSTR(
  N.SYSCONTACT_X, 
  1, 
  LOCATE(',', N.SYSCONTACT_X) - 1
)

您应该阅读手册中有关触发器的更多信息:http://pic.dhe.ibm.com/infocenter/db2luw/v10r1/topic/com.ibm.db2.luw.admin.dbobj.doc/doc/t0020225.html

【讨论】:

感谢您的回答..获取此信息。[IBM][CLI Driver][DB2/NT] SQL0104N 在“ON DB2ADMIN.SNMPSYS”之后发现了意外的标记“FOR EACH ROW MODE DB2SQL REFERENCING NEW” ”。预期的标记可能包括:“”。行号=2。 SQLSTATE=42601。我已经阅读了很多关于触发器的内容,我不知道什么是什么了。将 , 之前的所有内容移动到assettag_x 字段应该很简单。 我在我提供的代码中没有看到任何MODE DB2SQL。注意关键词的顺序——虽然你可以先穿袜子再穿裤子,但电脑不是这样的。 是的,对不起,忽略了...正在使用 SQL 助手并将其放入。有什么想法吗? 您是否能够完全按照我提供的方式复制和粘贴代码,还是坚持在其中引入自己的语法错误?比较你运行的和我展示的。 我已经尝试过复制和粘贴,但仍然出现与上述相同的错误。DB2 自动输入了 Connect to CMDB,而我的 harrisop 不正确,应该如上所示 db2admin... 我通过右键单击该字段并选择创建触发器来创建触发器,它将自行放入。希望我没有完全混淆你。非常沮丧,这不起作用,它需要在星期一之前。谢谢

以上是关于运行触发器时出错的主要内容,如果未能解决你的问题,请参考以下文章

在 Greenplum 中使用触发器时出错

您的 SQL 语法有错误...创建触发器时出错

表正在变异,触发器/函数可能看不到它/ORA-04088: 执行触发器时出错

使用 PL/SQL 块创建触发器时出错

创建 SQL 触发器以更新另一个表时出错

错误:部署云功能时解析触发器出错 - Firebase