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