Mysql中的跨数据库触发器

Posted

技术标签:

【中文标题】Mysql中的跨数据库触发器【英文标题】:Cross database trigger in Mysql 【发布时间】:2012-09-14 09:28:53 【问题描述】:

是否可以在 mysql 中为跨数据库访问应用触发器如果可以,请举一个例子。我的目的是如果在 database1 中插入/更新/删除任何新数据,则在 database2 中插入/更新/删除数据。我正在使用 MySQL 5.1

【问题讨论】:

跨数据库(不同的数据库安装)触发器不存在。 (跨模式,在一台服务器上,offcourse 确实存在)。尝试复制或 MySQLDump。 ***.com/questions/4406808/… @mridul4c 你到底要做什么? @Devart 实际上我有一个从我的 CMS 动态填充的数据库,每次插入或更新时,我都需要另一个数据库进行相同的插入或更新,而无需编写代码和使用触发器。 您可以在 dbForge Studio for MySQL 中借助 Date Comparison tool 同步数据库。您可以在命令行模式下运行它。 【参考方案1】:

是的,你可以。您可以创建一个程序并在触发器中调用它。程序示例:

DELIMITER //

CREATE PROCEDURE delete(in table VARCHAR(300), in db VARCHAR(300), in id INT)
BEGIN

set @query0 = CONCAT('DELETE FROM ', new_db, '.', tabela, ' WHERE id=',id);

PREPARE select_query0 FROM @query0;
EXECUTE select_query0;
DEALLOCATE PREPARE select_query0;

END; //

DELIMITER ;

然后创建触发器:

CREATE TRIGGER del_trigger BEFORE DELETE ON table
  FOR EACH ROW BEGIN
    CALL delete(db, table, OLD.id); 
  END;

【讨论】:

【参考方案2】:

我知道这是一个老话题,但我只需要自己实现一个跨数据库触发器,我想在这里展示解决方案,因为其他读者可能会从中受益。

在触发器的代码中,可以使用全名database_name.table_name引用目标数据库。

假设您在同一台服务器上有两个数据库:database1database2。在这两个数据库中的每一个中,您都有下表:

CREATE TABLE 'test' (
  'id' int(10) DEFAULT NULL,
  'name' varchar(100) DEFAULT NULL
)

database1 中创建以下 INSERT 触发器:

USE database1;

DELIMITER //
CREATE TRIGGER sync_insert AFTER INSERT ON test 
FOR EACH ROW
BEGIN
INSERT INTO database2.test SET id = NEW.id, name=NEW.name;
END; //
DELIMITER ;

为 UPDATE 和 DELETE 定义类似的触发器。

我想说这个解决方案比使用过程更简单直接。

我在 MySQL 5.1.73 和 MariaDB 10.2.13 上测试了上述内容。

【讨论】:

以上是关于Mysql中的跨数据库触发器的主要内容,如果未能解决你的问题,请参考以下文章

mysql数据库优化一

如何列出 MySQL 数据库中的所有触发器?

在 MySQL 中创建触发器以记录数据库中的更改

MySQL中的触发器应用

MySQL数据库高级——触发器

MySQL 触发器中的“INSTEAD OF”,从 SQL Server 转换而来