如何将Firebird的触发器迁移到PostgreSQL

时间:2019-07-11 14:52:23

标签: postgresql triggers migration firebird

我要将整个数据库从Firebird迁移到PostgreSQL,但这不是火箭科学。但是我在使用触发器时遇到了严重麻烦。特别是Firebird的POSITION参数。

实际上,我在搜索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 个答案:

答案 0 :(得分:1)

再次搜索,我在PostgreSQL Documentation中找到了一些东西:

  

如果为同一事件定义了多个相同类型的触发器,则将按名称的字母顺序触发它们

我认为它将成功。

但这是最佳方法吗?

答案 1 :(得分:1)

我定义触发器的标准方式如下:

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();

您定义的函数可以处理多个步骤。