使用不同的表触发检查条件,然后根据结果更改插入行的值

Posted

技术标签:

【中文标题】使用不同的表触发检查条件,然后根据结果更改插入行的值【英文标题】:Trigger check condition using different table, then change value of row being inserted depending on result 【发布时间】:2014-08-29 01:54:57 【问题描述】:

您好,我目前正在制作一个 SQL 触发器,它应该说“在向 CUSTOMER_ALIAS 表中插入一行时,检查该行中的三个地址列中的任何一个是否包含一个值存在于 US_STATES 表(由一列 - 'COUNTRY_NAME')中,如果客户的地址是美国州,则设置 INDICIA_STATE 当前插入到 'true' 的那一行

CREATE TRIGGER ADDRESS_T BEFORE INSERT ON MYDB.CUSTOMER_ALIAS 
    REFERENCING NEW ROW AS NEW_ROW
        WHEN
            EXISTS(SELECT * FROM MYDB.US_STATES WHERE US_STATES.COUNTRY_NAME = NEW_ROW.ADDRESS_1_COUNTRY OR US_STATES.COUNTRY_NAME = NEW_ROW.ADDRESS_2_COUNTRY OR US_STATES.COUNTRY_NAME = NEW_ROW.ADDRESS_3_COUNTRY)
        THEN SET NEW_ROW.INDICIA_STATE= 'true'
;

我收到这个错误

Error: DB2 SQL Error: SQLCODE=-104, SQLSTATE=42601, SQLERRMC=CREATE TRIGGER ADDRESS_T BEFORE INSERT ON D;BEGIN-OF-STATEMENT;<space>, DRIVER=4.16.53
SQLState:  42601
ErrorCode: -104

根据IBM's error code list,这似乎是一个语法错误,但我不明白它来自哪里。那个触发器应该是什么样子的?

【问题讨论】:

删除了 mysql 标签,因为问题是关于 DB2 的。 【参考方案1】:

除了 Gordon 所说的你应该说明它是行触发器还是语句触发器之外,我还认为 WHEN 子句需要它自己的一组括号:

CREATE TRIGGER ADDRESS_T 
BEFORE INSERT ON MYDB.CUSTOMER_ALIAS
REFERENCING NEW ROW AS NEW_ROW 
FOR EACH ROW
WHEN (
  EXISTS (
    SELECT * FROM MYDB.US_STATES 
    WHERE US_STATES.COUNTRY_NAME = NEW_ROW.ADDRESS_1_COUNTRY 
        OR US_STATES.COUNTRY_NAME = NEW_ROW.ADDRESS_2_COUNTRY 
        OR US_STATES.COUNTRY_NAME = NEW_ROW.ADDRESS_3_COUNTRY
  )
)
    SET NEW_ROW.INDICIA_STATE= 'true'

;

【讨论】:

【参考方案2】:

我不认为then 是触发器语法的一部分。您还可以使用in 简化逻辑。所以这可能有效:

CREATE TRIGGER ADDRESS_T BEFORE INSERT ON MYDB.CUSTOMER_ALIAS 
    REFERENCING NEW ROW AS NEW_ROW
    FOR EACH ROW
    WHEN EXISTS(SELECT 1 FROM MYDB.US_STATES WHERE US_STATES.COUNTRY_NAME IN (NEW_ROW.ADDRESS_1_COUNTRY, NEW_ROW.ADDRESS_2_COUNTRY, NEW_ROW.ADDRESS_3_COUNTRY)
               )
        SET NEW_ROW.INDICIA_STATE = 'true';

【讨论】:

这不起作用,它给了我同样的错误 - 任何人都可以确认上述语法是否有效,也许我的问题是由其他原因引起的。 @borisdzhelali 看起来你错过了FOR EACH ROW MODE DB2SQLFOR EACH STATEMENT MODE DB2SQL 子句; more info

以上是关于使用不同的表触发检查条件,然后根据结果更改插入行的值的主要内容,如果未能解决你的问题,请参考以下文章

存储过程 将数据插入到临时表,再根据条件判断 插入到不同的表

检查雪花中的表架构更改

停止触发器更改 scope_identity

如何根据条件更改 DataGridView 的行颜色以检查日期是不是过期

根据列中的状态更改创建触发器并在表的另一列中插入值

SQL 创建触发器以在特定条件下更新表