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

时间:2019-05-13 13:32:28

标签: mysql triggers database-trigger

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


简要说明

考虑模式“ S”和模式“ 1”至“ n”。 考虑模式“ S”具有表Users和表Company。 表用户与表Company的关系为1:1。每个用户都在公司中。表Company的列为“ schema”(varchar(255))

模式“ S”具有定义的表Users和表Company。其他所有模式都应具有表Users的副本。

但是表Users仅在模式S上修改。

每次修改表“ S”中的用户表时,我想将更改复制到“ n”表中,并且仅在表“ Company”中的“ schema”列==“ n”时复制。 / strong>

此限制使该问题不同于其他问题!

是的:

  • 所有架构都保留在同一数据库中。

Illustration of the issue

示例

考虑表用户具有以下列:

  • Id-int

  • 用户名-Varchar(255)

  • dateBirth-日期

  • idCompany-FK int

考虑表Company包含以下列:

  • Id-int
  • 模式-Varchar(255)

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

    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

2 个答案:

答案 0 :(得分:1)

您将需要使用动态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

答案 1 :(得分:0)

我对Hybernate一无所知,但是鉴于您只希望这些表为只读表,因此视图可能会起作用。尝试使用以下类似方法(由于问题的详细程度,某些名称已被修饰)来代替Company表的CREATE TABLE语句。

CREATE VIEW users AS
SELECT `id`, `username`, `dateBirth`, `schema`
FROM S.users
WHERE `schema` = 'schema X';

如果可行,它将节省所有复制开销。