Как перенести триггер Firebird в PostgreSQL - PullRequest
1 голос
/ 11 июля 2019

Я перевожу всю базу данных из Firebird в PostgreSQL, и это не ракетостроение.Но у меня серьезные проблемы с триггерами.Особенно аргумент POSITION в Firebird.

На самом деле, я ищу поведение POSITION.Мне это нужно, но в PostgreSQL.

Это триггеры в Firebird:

Этот триггер должен быть выполнен первым:

/* Trigger: TRG_CFE_ESTOQUE_PROCESSADO */
CREATE OR ALTER TRIGGER TRG_CFE_ESTOQUE_PROCESSADO FOR ITENS_CFE
 BEFORE UPDATE POSITION 0
AS                                                                                                                  
BEGIN                                                                                                               
  IF(NEW.ITE_QTD <> OLD.ITE_QTD)THEN                                                                                
  BEGIN                                                                                                             
    NEW.ITE_ESTOQUE_PROCESSADO = 'N';                                                                             
  END                                                                                                               
END

И этот должен быть выполненпосле:

/* Trigger: TRG_CFE_ESTOQUE_EXCLUIDO */
CREATE OR ALTER TRIGGER TRG_CFE_ESTOQUE_EXCLUIDO FOR ITENS_CFE
 BEFORE DELETE POSITION 1
AS                                                                                                                  
BEGIN                                                                                                               
  UPDATE ITENS_CFE                                                                                                  
     SET ITE_ESTOQUE_PROCESSADO = 'N'                                                                             
   WHERE PRO_CODIGO             = OLD.PRO_CODIGO                                                                    
     AND CFE_CODIGO             = OLD.CFE_CODIGO;                                                                   
END

Пока я не проверяю его, а просто ищу способ воспроизвести ожидаемое поведение.

Ответы [ 2 ]

1 голос
/ 11 июля 2019

Стандартный способ, которым я определил триггер, будет выглядеть следующим образом:

CREATE OR REPLACE FUNCTION func_table_x_after_insert()
RETURNS TRIGGER
AS $$
BEGIN
    INSERT INTO table_y
        (id)
    VALUES
        (NEW.id)
    ;
    RETURN NEW;
END;
$$  LANGUAGE PLPGSQL;

CREATE TRIGGER trig_table_x_after_insert
AFTER INSERT ON table_x
FOR EACH ROW EXECUTE PROCEDURE func_table_x_after_insert();

Определяемая вами функция может обрабатывать несколько шагов.

1 голос
/ 11 июля 2019

Повторный поиск, я нашел что-то в документации PostgreSQL :

Если для одного и того же события определены несколько триггеров одного типа, они будут запущены вв алфавитном порядке по имени

И я думаю, что это сделает магию.

Но разве это лучший способ сделать это?

...