为插入或更新触发的语法正确的语法在db2

问题描述 投票:0回答:1
从我能够收集到的东西,类似的事情应该起作用:

DROP TRIGGER trigger_check_customer_dob; CREATE TRIGGER trigger_check_customer_dob BEFORE INSERT OR UPDATE OF dob ON customers REFERENCING NEW AS newrow FOR EACH ROW WHEN (newrow.dob > current_date - INTERVAL '22 years') SIGNAL SQLSTATE '22007' ('Too young') ;

,但是,我会得到以下错误:

SQL错误[42601]:意外的令牌或更新“已找到”。
预期的令牌可能包括:“” .. sqlcode = -104,sqlstate = 42601,驱动程序=4.33.31

thttps://www.ibm.com/docs/en/db2/11.1?

正确的语法是什么? 我在Docker Image中运行DB2 12.1.1.0


MyDB2测试

SET CURRENT SCHEMA = 'DB2INST1';

创建桌子客户

CREATE TABLE CUSTOMERS ( ID INT GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1), NAME VARCHAR(100), DOB DATE, PRIMARY KEY (ID) );

triggers db2
1个回答
0
投票

Change sqlstate至75022。

insert触发
CREATE TRIGGER TRIGGER_CHECK_CUSTOMER_DOB_LESS22_INSERT NO CASCADE BEFORE INSERT ON CUSTOMERS REFERENCING NEW AS N_ROW FOR EACH ROW WHEN (YEAR(CURRENT DATE) - YEAR(N_ROW.DOB) < 22) BEGIN ATOMIC SIGNAL SQLSTATE '75022' SET MESSAGE_TEXT = 'Too young'; END;
  • update触发
      CREATE TRIGGER TRIGGER_CHECK_CUSTOMER_DOB_LESS22_UPDATE NO CASCADE BEFORE UPDATE OF DOB ON CUSTOMERS REFERENCING NEW AS N_ROW FOR EACH ROW WHEN (YEAR(CURRENT DATE) - YEAR(N_ROW.DOB) < 22) BEGIN ATOMIC SIGNAL SQLSTATE '75022' SET MESSAGE_TEXT = 'Too young'; END;
    1. 非正常插入数据
  • INSERT INTO CUSTOMERS ( NAME, DOB) VALUES ( 'Alice', DATE '2000-05-15'), ( 'DOB', DATE '1995-08-20'), ( 'Charlie', DATE '1998-12-10'), ( 'David', DATE '1999-03-25'), ( 'Eve', DATE '2001-07-30');
    1. 测试插入触发失败
    2. INSERT INTO CUSTOMERS ( NAME, DOB) VALUES ('Frank', DATE '2005-10-05');
  • get结果:

SQL ERROR [75022]: Application raised error or warning with diagnostic text: "Too young".. SQLCODE=-438, SQLSTATE=75022, DRIVER=4.33.31

测试更新触发失败

UPDATE CUSTOMERS SET DOB = DATE '2006-02-15' WHERE ID = 1;

get结果:

SQL ERROR [75022]: Application raised error or warning with diagnostic text: "Too young".. SQLCODE=-438, SQLSTATE=75022, DRIVER=4.33.31

	

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.