我面临以下问题:
我有两个MariaDB数据库,分别在两个不同的主机上运行。它们都用于运行两个不同的网站,每个网站都已安装并正在运行Drupal和CiviCRM。
网站1的CiviCRM联系人表中存储的某些数据需要与网站2上的这些联系人保持同步。 保持同步意味着:插入新联系人,并更新现有联系人。
我想知道是否可以通过触发来完成? 我知道我可以在cPanel上激活远程sql,因为我可以将其用于Mysql Workbench或类似软件。
有什么想法吗?触发器会起作用吗?我是否需要用其他语言而不是SQL编写一些代码?
答案 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
键。
希望这会有所帮助。