Python Postgresql触发器检查更改了哪些列的值?
在使用postgresql(v.9.5)触发器进行更新之前,需要根据列名查找行中已更改的列值,必须返回Null或NEW。当一个表的列数很多时,如何实现这一点呢?对每一行使用触发器Python Postgresql触发器检查更改了哪些列的值?,python,postgresql,triggers,Python,Postgresql,Triggers,在使用postgresql(v.9.5)触发器进行更新之前,需要根据列名查找行中已更改的列值,必须返回Null或NEW。当一个表的列数很多时,如何实现这一点呢?对每一行使用触发器中的json。 注意:如果旧/新值可能由NULL产生,则使用与不同 CREATE OR REPLACE FUNCTION public.test_tr_old_new() RETURNS trigger AS $$ DECLARE _rec record; BEGIN FOR _rec IN SELE
中的json
。
注意:如果旧/新值可能由NULL
产生,则使用与不同
CREATE OR REPLACE FUNCTION public.test_tr_old_new()
RETURNS trigger AS $$
DECLARE
_rec record;
BEGIN
FOR _rec IN
SELECT
o.key
, o.value AS old_value
, n.value AS new_value
FROM json_each(to_json(new)) n
INNER JOIN json_each(to_json(old)) o ON o.key = n.key
LOOP
IF (_rec.old_value::text IS DISTINCT FROM _rec.new_value::text) THEN
RAISE NOTICE 'test_tr_old_new(): Column % changed from ''%'' to ''%''', _rec.key, _rec.old_value, _rec.new_value;
END IF;
END LOOP;
RETURN NEW;
END;
$$
LANGUAGE 'plpgsql';
CREATE TRIGGER old_new
BEFORE UPDATE
ON public._tr_table
FOR EACH ROW
EXECUTE PROCEDURE public.test_tr_old_new();
对每行使用触发器中的json
。
注意:如果旧/新值可能由NULL
产生,则使用与不同
CREATE OR REPLACE FUNCTION public.test_tr_old_new()
RETURNS trigger AS $$
DECLARE
_rec record;
BEGIN
FOR _rec IN
SELECT
o.key
, o.value AS old_value
, n.value AS new_value
FROM json_each(to_json(new)) n
INNER JOIN json_each(to_json(old)) o ON o.key = n.key
LOOP
IF (_rec.old_value::text IS DISTINCT FROM _rec.new_value::text) THEN
RAISE NOTICE 'test_tr_old_new(): Column % changed from ''%'' to ''%''', _rec.key, _rec.old_value, _rec.new_value;
END IF;
END LOOP;
RETURN NEW;
END;
$$
LANGUAGE 'plpgsql';
CREATE TRIGGER old_new
BEFORE UPDATE
ON public._tr_table
FOR EACH ROW
EXECUTE PROCEDURE public.test_tr_old_new();