将数据从数据库插入运行在不同主机上的另一个数据库中

时间:2019-07-10 15:15:02

标签: sql drupal triggers mariadb civicrm

我面临以下问题:

我有两个MariaDB数据库,分别在两个不同的主机上运行。它们都用于运行两个不同的网站,每个网站都已安装并正在运行Drupal和CiviCRM。

网站1的CiviCRM联系人表中存储的某些数据需要与网站2上的这些联系人保持同步。 保持同步意味着:插入新联系人,并更新现有联系人。

我想知道是否可以通过触发来完成? 我知道我可以在cPanel上激活远程sql,因为我可以将其用于Mysql Workbench或类似软件。

有什么想法吗?触发器会起作用吗?我是否需要用其他语言而不是SQL编写一些代码?

1 个答案:

答案 0 :(得分:0)

您可以同时在您的settings.php中添加多个数据库以供Drupal连接:

$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键。

希望这会有所帮助。