diff --git a/vendor/magento/module-catalog-rule/Model/Indexer/IndexerTableSwapper.php b/vendor/magento/module-catalog-rule/Model/Indexer/IndexerTableSwapper.php index 0ddae74ff0a..98443f4a4dc 100644 --- a/vendor/magento/module-catalog-rule/Model/Indexer/IndexerTableSwapper.php +++ b/vendor/magento/module-catalog-rule/Model/Indexer/IndexerTableSwapper.php @@ -65,7 +65,9 @@ class IndexerTableSwapper implements IndexerTableSwapperInterface */ private function generateRandomSuffix(): string { - return bin2hex(random_bytes(4)); + return bin2hex( + random_bytes(4) + ); } /** @@ -91,6 +93,7 @@ class IndexerTableSwapper implements IndexerTableSwapperInterface $toDrop = []; /** @var string[] $temporaryTablesRenamed */ $temporaryTablesRenamed = []; + $restoreTriggerQueries = []; //Renaming temporary tables to original tables' names, dropping old //tables. foreach ($originalTablesNames as $tableName) { @@ -99,6 +102,7 @@ class IndexerTableSwapper implements IndexerTableSwapperInterface $tableName . $this->generateRandomSuffix() ); $temporaryTableName = $this->getWorkingTableName($tableName); + $restoreTriggerQueries[] = $this->getRestoreTriggerQueries($tableName); $toRename[] = [ 'oldName' => $tableName, 'newName' => $temporaryOriginalName, @@ -121,6 +125,41 @@ class IndexerTableSwapper implements IndexerTableSwapperInterface foreach ($toDrop as $tableName) { $this->resourceConnection->getConnection()->dropTable($tableName); } + + //Restoring triggers + $restoreTriggerQueries = array_merge([], ...$restoreTriggerQueries); + foreach ($restoreTriggerQueries as $restoreTriggerQuery) { + $this->resourceConnection->getConnection()->multiQuery($restoreTriggerQuery); + } + } + + /** + * Get queries for table triggers restoring. + * + * @param string $tableName + * @return array + */ + private function getRestoreTriggerQueries(string $tableName): array + { + $triggers = $this->resourceConnection->getConnection() + ->query('SHOW TRIGGERS LIKE \''. $tableName . '\'') + ->fetchAll(); + + if (!$triggers) { + return []; + } + + $result = []; + foreach ($triggers as $trigger) { + // phpcs:ignore Magento2.SQL.RawQuery.FoundRawSql + $result[] = 'DROP TRIGGER IF EXISTS ' . $trigger['Trigger']; + $triggerData = $this->resourceConnection->getConnection() + ->query('SHOW CREATE TRIGGER '. $trigger['Trigger']) + ->fetch(); + $result[] = preg_replace('/DEFINER=[^\s]*/', '', $triggerData['SQL Original Statement']); + } + + return $result; } /**