Postgres触发器中的远程异常处理?

时间:2016-05-09 23:27:48

标签: postgresql triggers

我们目前正在从Oracle迁移到Postgres。在Oracle中,我们有一个触发器创建语句,如下所示:

dim cRow = ws.Columns("A").Cells.Find("*", SearchOrder:=Excel.XlSearchOrder.xlByRows, LookIn:=Excel.XlFindLookIn.xlValues, SearchDirection:=Excel.XlSearchDirection.xlPrevious).Row +1

如果需要,您可以在Oracle触发器here中阅读有关远程异常处理的更多信息。

我们正在使用ora2pg来帮助迁移数据库,并将触发器创建语句更改为以下内容:

create or replace TRIGGER action2md                                         
    AFTER INSERT OR UPDATE OR DELETE
    ON action                                                               
    DECLARE 
    Mutating_table EXCEPTION;
    PRAGMA EXCEPTION_INIT (Mutating_table, -4091);
BEGIN
    UPDATE global_tables_md                                                 
    SET moddate = SYSTIMESTAMP
    WHERE table_name='action';                                              
EXCEPTION
    WHEN Mutating_table THEN
        NULL;
END;

这导致错误[42704]错误:类型“异常”不存在。

在我看来,问题与DECLARE块有关。您对如何在Postgres中创建等效触发器有任何见解吗?

1 个答案:

答案 0 :(得分:2)

似乎ora2pg无法处理Oracle触发器编译指示和异常,因此它在PG脚本中添加相同的代码,这在PostgreSQL中没有任何意义。

当一个触发器导致自身更新并因此触发一个新的触发器(或类似的东西)时,变异表是由Oracle触发的异常。这个触发器似乎适应了这种情况,捕获异常并且什么都不做。你必须删除PostgreSQL函数中的所有DECLARE和EXCEPTION部分,因为它们没有意义。

在PostgreSQL中,触发器可以导致后续(嵌套)触发器,开发人员有责任处理它们。这个答案说明了如何在PostgreSQL中处理嵌套触发器的示例:https://stackoverflow.com/a/14262289/3886053