即使条件不匹配也会触发 Db2 触发器

时间:2021-07-18 18:37:06

标签: if-statement triggers db2

我有一个更新触发器如下,理想情况下应该在 IF 语句上触发,如果列条目被修改,应该添加列名,但即使条件不满足我的触发器也会执行。有人可以指出我在这里做错了什么吗?截图如下

enter image description here

 CREATE OR REPLACE
TRIGGER test_trg_update AFTER
UPDATE
    ON
    test.person REFERENCING NEW AS N OLD AS O FOR EACH ROW
BEGIN
        
DECLARE change_type VARCHAR(10);

DECLARE modifier VARCHAR(50);

DECLARE change_time TIMESTAMP;

DECLARE changed_columns VARCHAR(1000);

DECLARE column_name VARCHAR(50);

DECLARE changeuser VARCHAR(50);

SET
changed_columns = '';

IF (n.NAME <> o.NAME) THEN SET
changed_columns = CONCAT (changed_columns,
'NAME,');


ELSEIF (n.PASSWORD <> o.PASSWORD) THEN SET
changed_columns = CONCAT (changed_columns,
'PASSWORD,');



ELSEIF (n.USERNAME <> o.USERNAME) THEN SET
changed_columns = CONCAT (changed_columns,
'USERNAME,');

END IF ;


SET
change_type = 'update';

SET
modifier = (
SELECT
    USER
FROM
    SYSIBM.SYSDUMMY1);

SET
change_time = (
VALUES CURRENT_TIMESTAMP);

if modifier= 'db2usr' THEN 

INSERT
    INTO
    Test_changelog (change_number,
    change_type,
    table_name,
    identifier,
    entry_type,
    changed_columns,
    modifiers_name,
    change_time)
VALUES (NEXT VALUE FOR TEST_CHANGELOG_SEQ,
change_type,
'test.person',
CONCAT ('id=',
N.ID),
'account',
changed_columns,
modifier,
change_time);
END IF;
END

1 个答案:

答案 0 :(得分:0)

--#SET TERMINATOR @
CREATE TABLE Test_changelog 
(
  change_number     INT NOT NULL GENERATED BY DEFAULT AS IDENTITY
, change_type       VARCHAR (50)
, table_name        VARCHAR (128)
, identifier        VARCHAR (50)
, entry_type        VARCHAR (50)
, changed_columns   VARCHAR (128)
, modifiers_name    VARCHAR (128)
, change_time       TIMESTAMP
) IN USERSPACE1
@

CREATE TABLE PERSON 
(
  ID        INT NOT NULL
, NAME      VARCHAR (50)
, PASSWORD  VARCHAR (50)
, USERNAME  VARCHAR (50)
) IN USERSPACE1
@

CREATE OR REPLACE
TRIGGER test_trg_update 
AFTER UPDATE ON person REFERENCING NEW AS N OLD AS O 
FOR EACH ROW
WHEN (n.NAME <> o.NAME or n.PASSWORD <> o.PASSWORD or n.USERNAME <> o.USERNAME)
BEGIN ATOMIC
INSERT INTO Test_changelog 
(
  change_number
, change_type
, table_name
, identifier
, entry_type
, changed_columns
, modifiers_name
, change_time
)
VALUES 
(
  DEFAULT
, 'update'
, 'test.person'
, 'id=' || N.ID
, 'account'
-- changed_columns
, SUBSTR 
(
     CASE WHEN n.NAME <> o.NAME         THEN ',NAME'     ELSE '' END 
  || CASE WHEN n.PASSWORD <> o.PASSWORD THEN ',PASSWORD' ELSE '' END
  || CASE WHEN n.USERNAME <> o.USERNAME THEN ',USERNAME' ELSE '' END
, 2
)
, USER
, CURRENT TIMESTAMP
);

END@

INSERT INTO PERSON (ID, NAME, PASSWORD, USERNAME)
VALUES (1, 'N1', 'P1', 'U1')@

UPDATE PERSON 
SET NAME = 'N2', PASSWORD = 'P2'
WHERE ID = 1@

SELECT * FROM Test_changelog@

为了方便起见,我稍微简化了触发逻辑。
请注意,如果您对所有列使用单个 IF 语句,并且更改了多个列,那么您将永远不会获得 db2 中已更改列的列表。只执行 IF 的一个分支。

相关问题