PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Безкраен цикъл в тригерната функция

ELSE клонът може да бъде радикално опростен. Но още няколко неща са неефективни/неточни/опасни:

CREATE OR REPLACE FUNCTION sample_trigger_func()
  RETURNS TRIGGER AS
$func$
BEGIN
   IF TG_OP = 'DELETE' THEN
      RAISE INFO 'OLD: %', OLD.name;

      EXECUTE format('INSERT INTO %I SELECT ($1).*', TG_TABLE_NAME || '_deletes')
      USING OLD #= hstore('{mod_op, mod_datetime}'::text[]
                         , ARRAY[left(TG_OP, 1), now()::text]);
      RETURN OLD;
   ELSE  -- insert, update
      NEW.mod_op       := left(TG_OP, 1);
      NEW.mod_datetime := now();

      RETURN NEW;
   END IF;
END
$func$  LANGUAGE plpgsql;

Добавих няколко други подобрения, докато го правех. А самият тригер трябва да изглежда така:

CREATE TRIGGER insupdel_bef
BEFORE INSERT OR UPDATE OR DELETE ON table_name
FOR EACH ROW EXECUTE PROCEDURE sample_trigger_func();

SQL Fiddle.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да създадете sql скрипт на схема на база данни на postgres?

  2. 3 начина за форматиране на число като процент в PostgreSQL

  3. Генерирайте SQL за актуализиране на първичен ключ

  4. оптимизирайте заявката в PostgreSQL

  5. Postgres масив json последна дата