sql - 在更新触发器上排除/忽略某些列
问题描述
我想排除某些列在更新时触发触发器,我尝试了此处显示的代码的几种变体,但是当更新前不为空时它不起作用(不更新import_timestamp
) 。processed_on
我尝试添加这个注释掉的 OR 子句,但仍然相同。有任何想法吗?
预期的行为是import_timestamp
在除 之外的任何列上更新更新processed_on
,并且不要在更新时更新它processed_on
(更新不可能processed_on
在与其他列相同的事务中发生)。
create table test
(
id serial,
some_value integer,
import_timestamp timestamp,
processed_on timestamp
);
insert into test(some_value, import_timestamp, processed_on)
values (1312, '2021-02-02 20:00:00', '2021-02-02 20:44:00'),
(124, '2021-02-02 20:10:00', null),
(500, '2021-02-02 20:20:00', null);
CREATE OR REPLACE FUNCTION trg_update_import_timestamp (
)
RETURNS trigger AS
$body$
BEGIN
IF OLD.processed_on = NEW.processed_on
--OR (OLD.processed_on = null AND NEW.processed_on = null)
THEN NEW.import_timestamp = now();
ELSE
NEW.import_timestamp = OLD.import_timestamp;
END IF;
RETURN NEW;
END;
$body$
LANGUAGE 'plpgsql';
CREATE TRIGGER test_update_trg
BEFORE UPDATE
ON test
FOR EACH ROW
EXECUTE PROCEDURE trg_update_import_timestamp();
update test set some_value = 444 where id in (1,3);
select * from test order by 1
解决方案
如果我理解正确,您需要一个新import_timestamp
的第 1 行和第 3 行。我相信这可以满足您的要求:
CREATE OR REPLACE FUNCTION trg_update_import_timestamp (
)
RETURNS trigger AS
$body$
BEGIN
IF OLD.processed_on is not distinct from NEW.processed_on
THEN NEW.import_timestamp = now();
ELSE NEW.import_timestamp = OLD.import_timestamp;
END IF;
RETURN NEW;
END;
$body$
LANGUAGE 'plpgsql';
这是一个 db<>fiddle。
推荐阅读
- visual-studio-code - VStudio 启动配置中的转义通配符损坏?
- nginx - 由于 nginx 抱怨,无法初始化微堆栈(快照版本 openstack)。有什么建议么?
- xero-api - Xero API:通过 Web 服务获取未实现的收益和损失的问题
- python - Plotly Dash - 为什么 base64 不在 PyPI 中?
- java - 扩展类的 scala 特征是如何为 JVM 目标编译的?
- r - 为 r 中的列分配新值
- google-apps-script - 电子表格:“您无权调用 setNumberFormat”
- wpf - ScrollViewer 不适用于 wpf 中的 tabcontrol
- apache-camel - 阿帕奇骆驼日期
- ubuntu - 无法使用 Snapcraft 创建快照