Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Postgresql触发器检查更改了哪些列的值?_Python_Postgresql_Triggers - Fatal编程技术网

Python Postgresql触发器检查更改了哪些列的值?

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

在使用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
    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();