【发布时间】:2021-02-25 17:36:25
【问题描述】:
我有一个表,其中有一列我设置了触发器以在行有更新时更新时间戳
CREATE TABLE mytable (
id NUMBER NOT NULL,
sid VARCHAR(10) NOT NULL,
stext VARCHAR(10),
tid VARCHAR(10),
ttext VARCHAR(10),
last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT unique PRIMARY KEY (id) ENABLE
);
CREATE OR REPLACE trigger last_updated_trigger
BEFORE UPDATE ON mytable
FOR EACH ROW
BEGIN
select systimestamp into :new.last_updated from dual;
END;
/
但是,当在表上执行某些 SQL 时,我不希望更新“last_updated”列。例如,当下面的 SQL 更新此表时,我确实不希望触发器启动。我需要该列保留 last_updated 值,这样我的其他查询就不会被弄乱。但是,当其他 SQL 对数据进行更新时,我希望更新列。
关于如何做到这一点的任何想法?
MERGE INTO mytable
USING dual
ON (id = ?)
WHEN MATCHED THEN
UPDATE SET
stext = case when sid = ? then ? else stext end,
ttext = case when tid = ? then ? else ttext end
【问题讨论】:
-
要么你想要在触发器中设置值,要么你不想要。也许您应该手动设置值并删除触发器。
-
谢谢戈登。有什么方法可以修改触发器,以便仅在 SQL 未提供值时更新列和/或修改 SQL 以保留列的旧值?
-
戴上我的 IT 审计员帽子。你刚刚没有通过审核。您有一列指示某行何时发生操作,但有时 id 根本不指示这一点。那么“last_updated”列的实际含义是什么。