【问题标题】:Cross database trigger in MysqlMysql中的跨数据库触发器
【发布时间】:2023-03-19 07:54:01
【问题描述】:

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

【问题讨论】:

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

标签: mysql sql triggers


【解决方案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 上测试了上述内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-02
      • 1970-01-01
      • 2010-09-11
      • 1970-01-01
      • 2011-10-30
      • 2012-08-31
      • 1970-01-01
      相关资源
      最近更新 更多