Skip to content

Commit 78c2c21

Browse files
[2.3-develop] Forwardport of #11369
1 parent 3881f04 commit 78c2c21

File tree

6 files changed

+159
-0
lines changed

6 files changed

+159
-0
lines changed

Diff for: app/code/Magento/Backup/Model/Db.php

+1
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,7 @@ public function createBackup(\Magento\Framework\Backup\Db\BackupInterface $backu
173173
}
174174
}
175175
$backup->write($this->getResource()->getTableForeignKeysSql());
176+
$backup->write($this->getResource()->getTableTriggersSql());
176177
$backup->write($this->getResource()->getFooter());
177178

178179
$this->getResource()->commitTransaction();

Diff for: app/code/Magento/Backup/Model/ResourceModel/Db.php

+25
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,31 @@ public function getTableForeignKeysSql($tableName = null)
114114
return $fkScript;
115115
}
116116

117+
/**
118+
* Return triggers for table(s).
119+
*
120+
* @param string|null $tableName
121+
* @param bool $addDropIfExists
122+
* @return string
123+
*/
124+
public function getTableTriggersSql($tableName = null, $addDropIfExists = true)
125+
{
126+
$triggerScript = '';
127+
if (!$tableName) {
128+
$tables = $this->getTables();
129+
foreach ($tables as $table) {
130+
$tableTriggerScript = $this->_resourceHelper->getTableTriggersSql($table, $addDropIfExists);
131+
if (!empty($tableTriggerScript)) {
132+
$triggerScript .= "\n" . $tableTriggerScript;
133+
}
134+
}
135+
} else {
136+
$triggerScript = $this->getTableTriggersSql($tableName, $addDropIfExists);
137+
}
138+
139+
return $triggerScript;
140+
}
141+
117142
/**
118143
* Retrieve table status
119144
*

Diff for: app/code/Magento/Backup/Model/ResourceModel/Helper.php

+36
Original file line numberDiff line numberDiff line change
@@ -337,4 +337,40 @@ public function restoreTransactionIsolationLevel()
337337
{
338338
$this->getConnection()->query('SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ');
339339
}
340+
341+
/**
342+
* Get create script for triggers.
343+
*
344+
* @param string $tableName
345+
* @param boolean $addDropIfExists
346+
* @param boolean $stripDefiner
347+
* @return string
348+
*/
349+
public function getTableTriggersSql($tableName, $addDropIfExists = false, $stripDefiner = true)
350+
{
351+
$script = "--\n-- Triggers structure for table `{$tableName}`\n--\n";
352+
$triggers = $this->getConnection()->query('SHOW TRIGGERS LIKE \''. $tableName . '\'')->fetchAll();
353+
354+
if (!$triggers) {
355+
return '';
356+
}
357+
foreach ($triggers as $trigger) {
358+
if ($addDropIfExists) {
359+
$script .= 'DROP TRIGGER IF EXISTS ' . $trigger['Trigger'] . ";\n";
360+
}
361+
$script .= "delimiter ;;\n";
362+
363+
$triggerData = $this->getConnection()->query('SHOW CREATE TRIGGER '. $trigger['Trigger'])->fetch();
364+
if ($stripDefiner) {
365+
$cleanedScript = preg_replace('/DEFINER=[^\s]*/', '', $triggerData['SQL Original Statement']);
366+
$script .= $cleanedScript . "\n";
367+
} else {
368+
$script .= $triggerData['SQL Original Statement'] . "\n";
369+
}
370+
$script .= ";;\n";
371+
$script .= "delimiter ;\n";
372+
}
373+
374+
return $script;
375+
}
340376
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
namespace Magento\Framework\Backup;
8+
9+
use Magento\Backup\Helper\Data;
10+
use Magento\Framework\App\Filesystem\DirectoryList;
11+
use Magento\Framework\Filesystem;
12+
use Magento\Framework\Module\Setup;
13+
use Magento\TestFramework\Helper\Bootstrap;
14+
use PHPUnit\Framework\TestCase;
15+
16+
/**
17+
* Provide tests for \Magento\Framework\Backup\Db.
18+
*/
19+
class DbTest extends TestCase
20+
{
21+
/**
22+
* Test db backup includes triggers.
23+
*
24+
* @magentoDataFixture Magento/Framework/Backup/_files/trigger.php
25+
*/
26+
public function testBackupIncludesCustomTriggers()
27+
{
28+
$helper = Bootstrap::getObjectManager()->get(Data::class);
29+
$time = time();
30+
$backupManager = Bootstrap::getObjectManager()->get(Factory::class)->create(
31+
Factory::TYPE_DB
32+
)->setBackupExtension(
33+
$helper->getExtensionByType(Factory::TYPE_DB)
34+
)->setTime(
35+
$time
36+
)->setBackupsDir(
37+
$helper->getBackupsDir()
38+
)->setName('test_backup');
39+
$backupManager->create();
40+
$write = Bootstrap::getObjectManager()->get(Filesystem::class)->getDirectoryWrite(DirectoryList::VAR_DIR);
41+
$content = $write->readFile('/backups/' . $time . '_db_testbackup.sql');
42+
$tableName = Bootstrap::getObjectManager()->get(Setup::class)
43+
->getTable('test_table_with_custom_trigger');
44+
$this->assertRegExp(
45+
'/CREATE TRIGGER test_custom_trigger AFTER INSERT ON '. $tableName . ' FOR EACH ROW/',
46+
$content
47+
);
48+
//Clean up.
49+
$write->delete('/backups/' . $time . '_db_testbackup.sql');
50+
}
51+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
use Magento\Framework\DB\Ddl\Trigger;
8+
use Magento\Framework\DB\Ddl\TriggerFactory;
9+
use Magento\Framework\Module\Setup;
10+
use Magento\TestFramework\Helper\Bootstrap;
11+
12+
$setup = Bootstrap::getObjectManager()->get(Setup::class);
13+
$tableName = $setup->getTable('test_table_with_custom_trigger');
14+
$table = $setup->getConnection()->newTable(
15+
$tableName
16+
)->addColumn(
17+
'id',
18+
\Magento\Framework\DB\Ddl\Table::TYPE_SMALLINT,
19+
null,
20+
['identity' => true, 'nullable' => false, 'primary' => true],
21+
'ID'
22+
)->setComment(
23+
'Test table with test custom trigger'
24+
);
25+
$setup->getConnection()->createTable($table);
26+
27+
$trigger = Bootstrap::getObjectManager()->get(TriggerFactory::class)->create()
28+
->setName('test_custom_trigger')
29+
->setTime(Trigger::TIME_AFTER)
30+
->setEvent(Trigger::EVENT_INSERT)
31+
->setTable($tableName)
32+
->addStatement($setup->getConnection()->quoteInto('SET @test_variable = ?', 'test_value'));
33+
$setup->getConnection()->createTrigger($trigger);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
use Magento\Framework\Module\Setup;
8+
use Magento\TestFramework\Helper\Bootstrap;
9+
10+
$setup = Bootstrap::getObjectManager()->get(Setup::class);
11+
$tableName = $setup->getTable('test_table_with_custom_trigger');
12+
$setup->getConnection()->dropTrigger('test_custom_trigger');
13+
$setup->getConnection()->dropTable($tableName);

0 commit comments

Comments
 (0)