我们目前正在从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中创建等效触发器有任何见解吗?
答案 0 :(得分:2)
似乎ora2pg无法处理Oracle触发器编译指示和异常,因此它在PG脚本中添加相同的代码,这在PostgreSQL中没有任何意义。
当一个触发器导致自身更新并因此触发一个新的触发器(或类似的东西)时,变异表是由Oracle触发的异常。这个触发器似乎适应了这种情况,捕获异常并且什么都不做。你必须删除PostgreSQL函数中的所有DECLARE和EXCEPTION部分,因为它们没有意义。
在PostgreSQL中,触发器可以导致后续(嵌套)触发器,开发人员有责任处理它们。这个答案说明了如何在PostgreSQL中处理嵌套触发器的示例:https://stackoverflow.com/a/14262289/3886053。