如何检测是否为插入或更新触发了触发器?

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);