Working version with --preserve-triggers

This commit is contained in:
Manjot Singh
2016-05-26 23:36:17 -07:00
parent 5cb5f03417
commit 20641dab2b

View File

@@ -8030,6 +8030,7 @@ my $dont_interrupt_now = 0;
my @drop_trigger_sqls; my @drop_trigger_sqls;
my @triggers_not_dropped; my @triggers_not_dropped;
my $pxc_version = '0'; my $pxc_version = '0';
my @orig_triggers = ('','','');
# Completely ignore these error codes. # Completely ignore these error codes.
my %ignore_code = ( my %ignore_code = (
# Error: 1592 SQLSTATE: HY000 (ER_BINLOG_UNSAFE_STATEMENT) # Error: 1592 SQLSTATE: HY000 (ER_BINLOG_UNSAFE_STATEMENT)
@@ -9546,6 +9547,16 @@ sub main {
$plugin->before_swap_tables(); $plugin->before_swap_tables();
} }
if ( $o->get('preserve-triggers') ) {
print "Adding original triggers to new table.\n";
foreach my $orig_trigger (@orig_triggers) {
PTDEBUG && _d($orig_trigger);
print $orig_trigger, "\n" if $o->get('print');
$cxn->dbh()->do($orig_trigger);
}
}
my $old_tbl; my $old_tbl;
if ( $o->get('swap-tables') ) { if ( $o->get('swap-tables') ) {
@@ -10577,11 +10588,6 @@ sub create_triggers {
my $orig_insert_trigger; my $orig_insert_trigger;
my $orig_update_trigger; my $orig_update_trigger;
my %orig_triggers = (
del => '',
ins => '',
upd => ''
);
if ( $o->get('preserve-triggers') ) { if ( $o->get('preserve-triggers') ) {
$cxn->connect(); $cxn->connect();
@@ -10628,14 +10634,15 @@ sub create_triggers {
. "UNLOCK TABLES;"; . "UNLOCK TABLES;";
} }
$orig_triggers{del} my $definer = $orig_delete_trigger->[2];
= "LOCK TABLES $orig_tbl->{name} WRITE;\n" $definer =~ s/@/`@`/;
. "DROP TRIGGER IF EXISTS `${prefix}_del`;\n" $definer = "`".$definer."`";
. "CREATE DEFINER=$orig_delete_trigger->[2] TRIGGER `$orig_delete_trigger->[0]`.`$orig_delete_trigger->[1]` "
. "AFTER DELETE ON $orig_tbl->{name}\n" $orig_triggers[0]
= "CREATE DEFINER=$definer TRIGGER `$orig_delete_trigger->[0]`.`$orig_delete_trigger->[1]` "
. "AFTER DELETE ON $new_tbl->{name}\n"
. "FOR EACH ROW\n" . "FOR EACH ROW\n"
. $orig_delete_trigger->[3] . ";\n" . $orig_delete_trigger->[3] . ";\n";
. "UNLOCK TABLES;";
} }
else { else {
$delete_trigger $delete_trigger
@@ -10680,14 +10687,15 @@ sub create_triggers {
. "UNLOCK TABLES;"; . "UNLOCK TABLES;";
} }
$orig_triggers{del} my $definer = $orig_insert_trigger->[2];
= "LOCK TABLES $orig_tbl->{name} WRITE;\n" $definer =~ s/@/`@`/;
. "DROP TRIGGER IF EXISTS `${prefix}_del`;\n" $definer = "`".$definer."`";
. "CREATE DEFINER=$orig_insert_trigger->[2] TRIGGER `$orig_insert_trigger->[0]`.`$orig_insert_trigger->[1]` "
. "AFTER DELETE ON $orig_tbl->{name}\n" $orig_triggers[1]
= "CREATE DEFINER=$definer TRIGGER `$orig_insert_trigger->[0]`.`$orig_insert_trigger->[1]` "
. "AFTER INSERT ON $new_tbl->{name}\n"
. "FOR EACH ROW\n" . "FOR EACH ROW\n"
. $orig_insert_trigger->[3] . ";\n" . $orig_insert_trigger->[3] . ";\n";
. "UNLOCK TABLES;";
} }
else { else {
$insert_trigger $insert_trigger
@@ -10732,14 +10740,15 @@ sub create_triggers {
. "UNLOCK TABLES;"; . "UNLOCK TABLES;";
} }
$orig_triggers{del} my $definer = $orig_update_trigger->[2];
= "LOCK TABLES $orig_tbl->{name} WRITE;\n" $definer =~ s/@/`@`/;
. "DROP TRIGGER IF EXISTS `${prefix}_del`;\n" $definer = "`".$definer."`";
. "CREATE DEFINER=$orig_update_trigger->[2] TRIGGER `$orig_update_trigger->[0]`.`$orig_update_trigger->[1]` "
. "AFTER DELETE ON $orig_tbl->{name}\n" $orig_triggers[2]
= "CREATE DEFINER=$definer TRIGGER `$orig_update_trigger->[0]`.`$orig_update_trigger->[1]` "
. "AFTER UPDATE ON $new_tbl->{name}\n"
. "FOR EACH ROW\n" . "FOR EACH ROW\n"
. $orig_update_trigger->[3] . ";\n" . $orig_update_trigger->[3] . ";\n";
. "UNLOCK TABLES;";
} }
else { else {
@@ -10776,9 +10785,6 @@ sub create_triggers {
# (or faked to be created) so if the 2nd trigger # (or faked to be created) so if the 2nd trigger
# fails to create, we know to only drop the 1st. # fails to create, we know to only drop the 1st.
push @trigger_names, "${prefix}_$name"; push @trigger_names, "${prefix}_$name";
if ( $o->get('preserve-triggers') ) {
push @drop_trigger_sqls, $orig_triggers{$name};
}
push @drop_trigger_sqls, push @drop_trigger_sqls,
"DROP TRIGGER IF EXISTS " "DROP TRIGGER IF EXISTS "
. $q->quote($orig_tbl->{db}, "${prefix}_$name") . ";"; . $q->quote($orig_tbl->{db}, "${prefix}_$name") . ";";
@@ -11806,7 +11812,8 @@ you notice queueing, it is best to decrease the chunk time.
=item --preserve-triggers =item --preserve-triggers
Preserves old triggers when specified. Preserves old triggers when specified. This mode will briefly hold up to 3
locks when it rewrites original triggers to include the tool code.
=item --new-table-name =item --new-table-name