如何检测是否为插入或更新触发了触发器?
How to detect if a trigger is fired for an insert or update?
我需要在我的数据库中创建一个 table,其中包含给定 table 中出现的所有 DML 语句的所有历史记录。 LOG
table 是这样的:
id
event
ts
record
1
update
2020-01-01
record1
2
delete
2020-01-02
record2
LOG table 有一个自动递增 ID
列的序列,TS 默认是 NOW
.
我是否需要先为每个语句创建一个序列,或者我可以只为 AFTER
触发 DML 语句创建触发器?
CREATE TRIGGER UPDATE
ACTIVE AFTER INSERT OR UPDATE
ON TableA
AS
BEGIN
INSERT INTO LOG (event,record)
SELECT record FROM TableA; # what I need to add here to set the event = UPDATE,INSERT or DELETE?
END
我可以在触发器中使用类似这样的语句来添加事件值吗?
编辑:感谢@Mark Rotteveel 和@Arioch'The:
,这是可行的解决方案
CREATE TRIGGER INSERT_UPDATE FOR TableA
ACTIVE AFTER INSERT OR UPDATE
AS
BEGIN
IN AUTONOMOUS TRANSACTION DO
INSERT INTO LOG(event,record)
VALUES (CASE WHEN inserting THEN 'INSERTED' WHEN updating THEN 'UPDATED' END, new.record);
END
要检测事件类型,您可以使用 INSERTING
or UPDATING
(or DELETING
) 上下文变量。
顺便说一句,不要在 TableA
的触发器中使用 SELECT record FROM TableA
,而是使用 NEW
context(或 OLD
进行删除)。
解决方案看起来像这样:
insert into LOG (event, record)
values (case when :inserting then 'insert' when :updating then 'update' end, new.record);
我需要在我的数据库中创建一个 table,其中包含给定 table 中出现的所有 DML 语句的所有历史记录。 LOG
table 是这样的:
id | event | ts | record |
---|---|---|---|
1 | update | 2020-01-01 | record1 |
2 | delete | 2020-01-02 | record2 |
LOG table 有一个自动递增 ID
列的序列,TS 默认是 NOW
.
我是否需要先为每个语句创建一个序列,或者我可以只为 AFTER
触发 DML 语句创建触发器?
CREATE TRIGGER UPDATE
ACTIVE AFTER INSERT OR UPDATE
ON TableA
AS
BEGIN
INSERT INTO LOG (event,record)
SELECT record FROM TableA; # what I need to add here to set the event = UPDATE,INSERT or DELETE?
END
我可以在触发器中使用类似这样的语句来添加事件值吗?
编辑:感谢@Mark Rotteveel 和@Arioch'The:
,这是可行的解决方案CREATE TRIGGER INSERT_UPDATE FOR TableA
ACTIVE AFTER INSERT OR UPDATE
AS
BEGIN
IN AUTONOMOUS TRANSACTION DO
INSERT INTO LOG(event,record)
VALUES (CASE WHEN inserting THEN 'INSERTED' WHEN updating THEN 'UPDATED' END, new.record);
END
要检测事件类型,您可以使用 INSERTING
or UPDATING
(or DELETING
) 上下文变量。
顺便说一句,不要在 TableA
的触发器中使用 SELECT record FROM TableA
,而是使用 NEW
context(或 OLD
进行删除)。
解决方案看起来像这样:
insert into LOG (event, record)
values (case when :inserting then 'insert' when :updating then 'update' end, new.record);