首页 > 解决方案 > 如何设置触发器以从另一个模式插入另一个表?

问题描述

如何设置触发器以从另一个模式插入另一个表?


简要说明

考虑模式“S”和模式“1”到“n”。考虑模式“S”具有表用户和表公司。表 users 与表 Company 具有 1:1 的关系。每个用户都在一家公司。表公司有列“模式”(varchar(255))

模式“S”定义了表用户和表公司。每个其他模式都应该有表用户的副本。

然而,表用户仅在模式 S 上被修改。

每次修改模式“S”中的表用户时,我想将更改复制到模式“n”IF 并且仅当表“公司”== 'n' 中的列“模式”。

这个限制使这个问题与其他问题不同!

是的:

问题说明

例子

考虑表用户具有以下列:

考虑公司表有以下列:

当我在模式“S”的用户表上进行插入时,我希望发生以下情况:

    if User.Company.schema == "schema A"{

        replicate to schema "A";

    } else if User.Company.schema == "schema N"{
        replicate to schema "N";
    }
....

我对如何在下面的代码中执行该逻辑感到困惑:

CREATE DEFINER=`root`@`localhost` TRIGGER `user_AFTER_INSERT` AFTER INSERT ON `user` FOR EACH ROW BEGIN

END

标签: mysqltriggersdatabase-trigger

解决方案


您将需要使用动态 SQL 来构建INSERT对其他数据库的查询:

CREATE DEFINER=`root`@`localhost` TRIGGER `user_AFTER_INSERT` AFTER INSERT ON `user` 
FOR EACH ROW 
BEGIN
  SELECT schema INTO @schema FROM Company WHERE Id = NEW.idCompany;
  SET @sql = CONCAT('INSERT INTO `', @schema, '`.`Users` (id, username, dateBirth, idCompany) VALUES(?, ?, ?, ?)';
  PREPARE stmt FROM @sql;
  SET @id = NEW.id;
  SET @username = NEW.username;
  SET @dateBirth = NEW.dateBirth;
  SET @idCompany = NEW.idCompany;
  EXECUTE stmt USING @id, @username, @dateBirth, @idCompany;
  DEALLOCATE PREPARE stmt;
END

推荐阅读