Вставить данные из базы данных в другую базу данных, работающую на разных хостах - PullRequest
0 голосов
/ 10 июля 2019

Я столкнулся со следующей проблемой:

У меня есть две базы данных MariaDB, работающие на двух разных хостах. Оба они используются для запуска двух разных веб-сайтов, на каждом из которых установлены и работают Drupal и CiviCRM.

Некоторые данные, хранящиеся в таблице контактов CiviCRM с веб-сайта 1, необходимо синхронизировать с этими же контактами на веб-сайте 2. Синхронизация означает: вставку новых контактов и обновление существующих контактов.

Мне было интересно, можно ли это сделать через триггер? Я знаю, что могу активировать удаленный sql на моей cPanel, так как я использую это для работы с Mysql Workbench или подобным программным обеспечением.

Есть идеи? Сработает ли триггер? Нужно ли мне писать код на другом языке, нежели SQL?

1 Ответ

0 голосов
/ 11 июля 2019

Вы можете добавить несколько баз данных для подключения вашего Drupal в вашем файле settings.php:

$databases = [
    'HOST1.DATABASE' => [
        'default' => [
            'driver' => 'mysql',
            'username' => '',
            'password' => '',
            'host' => '127.0.0.1',
            'port' => '3306',
            'prefix' => '',
            'database' => 'contacts',
            'collation' => 'utf8mb4_general_ci',
         ],
    ],
    'HOST2.DATABASE' => [
        'default' => [
            'driver' => 'mysql',
            'username' => '',
            'password' => '',
            'host' => '127.0.0.1',
            'port' => '3306',
            'prefix' => '',
            'database' => 'contacts_audit',
            'collation' => 'utf8mb4_general_ci',
         ],
    ],
];

После этого вы можете определить в методе getConnection(), какой ключ $database массив, который вы хотите подключить.

\Drupal\Core\Database\Database::getConnection('HOST1.DATABASE')
    ->query('CREATE TRIGGER contacts_after_update AFTER UPDATE ON contacts FOR EACH ROW BEGIN')
    ->execute();

и

\Drupal\Core\Database\Database::getConnection('HOST2.DATABASE')
    ->query('INSERT INTO contacts_audit ( contact_id, updated_date, updated_by) VALUES ( NEW.contact_id, SYSDATE(), ); END;')
    ->execute();

(Если вы оставите параметр getConnection() пустым, он будет подключаться к базе данных по ключу $databases['default']Кроме того, вы можете использовать setActiveConnection(), если вы хотите больше работать с базой данных, которая, как следует из ее названия, устанавливает активное соединение с нужным ключом $databases)

Надеюсь, это поможет каким-то образом.

...