Skip to content

Commit d89fedd

Browse files
committed
Backported CORE-6028: Trigger on system table restored in FB3 database and can't be deleted
1 parent c797e80 commit d89fedd

File tree

3 files changed

+38
-5
lines changed

3 files changed

+38
-5
lines changed

src/burp/backup.epp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4179,9 +4179,14 @@ void write_triggers()
41794179
if (tdgbl->runtimeODS >= DB_VERSION_DDL11_1)
41804180
{
41814181
FOR (REQUEST_HANDLE req_handle1)
4182-
X IN RDB$TRIGGERS WITH
4183-
X.RDB$SYSTEM_FLAG NE 1 OR
4184-
X.RDB$SYSTEM_FLAG MISSING
4182+
X IN RDB$TRIGGERS
4183+
CROSS Y IN RDB$RELATIONS OVER RDB$RELATION_NAME
4184+
WITH
4185+
(X.RDB$SYSTEM_FLAG NE 1 OR
4186+
X.RDB$SYSTEM_FLAG MISSING)
4187+
AND
4188+
(Y.RDB$SYSTEM_FLAG NE 1 OR
4189+
Y.RDB$SYSTEM_FLAG MISSING)
41854190

41864191
put(tdgbl, rec_trigger);
41874192
const SSHORT l = PUT_TEXT (att_trig_name, X.RDB$TRIGGER_NAME);

src/burp/burp.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1048,6 +1048,7 @@ class BurpGlobals : public Firebird::ThreadData, public GblPool
10481048
isc_req_handle handles_get_trigger_message_req_handle2;
10491049
isc_req_handle handles_get_trigger_old_req_handle1;
10501050
isc_req_handle handles_get_trigger_req_handle1;
1051+
isc_req_handle handles_get_trigger_req_handle2;
10511052
isc_req_handle handles_get_type_req_handle1;
10521053
isc_req_handle handles_get_user_privilege_req_handle1;
10531054
isc_req_handle handles_get_view_req_handle1;

src/burp/restore.epp

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8475,9 +8475,10 @@ bool get_trigger(BurpGlobals* tdgbl)
84758475
* Get a trigger definition in rdb$triggers.
84768476
*
84778477
**************************************/
8478-
att_type attribute;
8478+
att_type attribute;
84798479
BASED_ON RDB$TRIGGERS.RDB$TRIGGER_NAME name;
8480-
scan_attr_t scan_next_attr;
8480+
scan_attr_t scan_next_attr;
8481+
bool skipTrig = false;
84818482

84828483
isc_tr_handle local_trans = tdgbl->global_trans ? tdgbl->global_trans : gds_trans;
84838484

@@ -8545,6 +8546,14 @@ bool get_trigger(BurpGlobals* tdgbl)
85458546
case att_trig_relation_name:
85468547
X.RDB$RELATION_NAME.NULL = FALSE;
85478548
GET_TEXT(X.RDB$RELATION_NAME);
8549+
// Check for trigger on system relation
8550+
FOR (TRANSACTION_HANDLE local_trans REQUEST_HANDLE tdgbl->handles_get_trigger_req_handle2)
8551+
Y IN RDB$RELATIONS
8552+
WITH Y.RDB$RELATION_NAME EQ X.RDB$RELATION_NAME
8553+
AND Y.RDB$SYSTEM_FLAG EQ 1
8554+
8555+
skipTrig = true;
8556+
END_FOR;
85488557
break;
85498558

85508559
case att_trig_sequence:
@@ -8616,6 +8625,11 @@ bool get_trigger(BurpGlobals* tdgbl)
86168625
break;
86178626
}
86188627
}
8628+
8629+
// Skip trigger on system relation
8630+
if (skipTrig)
8631+
return true;
8632+
86198633
END_STORE;
86208634
ON_ERROR
86218635
general_on_error ();
@@ -8674,6 +8688,14 @@ bool get_trigger(BurpGlobals* tdgbl)
86748688
case att_trig_relation_name:
86758689
X.RDB$RELATION_NAME.NULL = FALSE;
86768690
GET_TEXT(X.RDB$RELATION_NAME);
8691+
// Check for trigger on system relation
8692+
FOR (TRANSACTION_HANDLE local_trans REQUEST_HANDLE tdgbl->handles_get_trigger_req_handle2)
8693+
Y IN RDB$RELATIONS
8694+
WITH Y.RDB$RELATION_NAME EQ X.RDB$RELATION_NAME
8695+
AND Y.RDB$SYSTEM_FLAG EQ 1
8696+
8697+
skipTrig = true;
8698+
END_FOR;
86778699
break;
86788700

86798701
case att_trig_sequence:
@@ -8734,6 +8756,11 @@ bool get_trigger(BurpGlobals* tdgbl)
87348756
break;
87358757
}
87368758
}
8759+
8760+
// Skip trigger on system relation
8761+
if (skipTrig)
8762+
return true;
8763+
87378764
END_STORE;
87388765
ON_ERROR
87398766
general_on_error ();

0 commit comments

Comments
 (0)