diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index 9ff7f4ca70e..53d61022230 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -5378,6 +5378,9 @@ getTriggers(Archive *fout, TableInfo tblinfo[], int numTables) tginfo = (TriggerInfo *) pg_malloc(ntups * sizeof(TriggerInfo)); + tbinfo->numTriggers = ntups; + tbinfo->triggers = tginfo; + for (j = 0; j < ntups; j++) { tginfo[j].dobj.objType = DO_TRIGGER; diff --git a/src/bin/pg_dump/pg_dump.h b/src/bin/pg_dump/pg_dump.h index 1ca702d1e0c..c492ae9a96a 100644 --- a/src/bin/pg_dump/pg_dump.h +++ b/src/bin/pg_dump/pg_dump.h @@ -291,6 +291,8 @@ typedef struct _tableInfo int numParents; /* number of (immediate) parent tables */ struct _tableInfo **parents; /* TableInfos of immediate parents */ struct _tableDataInfo *dataObj; /* TableDataInfo, if dumping its data */ + int numTriggers; /* number of triggers for table */ + struct _triggerInfo *triggers; /* array of TriggerInfo structs */ } TableInfo; typedef struct _attrDefInfo diff --git a/src/bin/pg_dump/pg_dump_sort.c b/src/bin/pg_dump/pg_dump_sort.c index dbdc04889c8..467282cd68c 100644 --- a/src/bin/pg_dump/pg_dump_sort.c +++ b/src/bin/pg_dump/pg_dump_sort.c @@ -760,6 +760,7 @@ repairViewRuleMultiLoop(DumpableObject *viewobj, { TableInfo *viewinfo = (TableInfo *) viewobj; RuleInfo *ruleinfo = (RuleInfo *) ruleobj; + int i; /* remove view's dependency on rule */ removeObjectDependency(viewobj, ruleobj->dumpId); @@ -777,6 +778,9 @@ repairViewRuleMultiLoop(DumpableObject *viewobj, addObjectDependency(ruleobj, viewobj->dumpId); /* now that rule is separate, it must be post-data */ addObjectDependency(ruleobj, postDataBoundId); + /* also, any triggers on the view must be dumped after the rule */ + for (i = 0; i < viewinfo->numTriggers; i++) + addObjectDependency(&(viewinfo->triggers[i].dobj), ruleobj->dumpId); } /*