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

How to set a trigger to insert in another table from another schema?

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


简要说明

正在考虑架构 "S" 和架构“1”到 "n"。 考虑架构 "S" 有 table 用户和 table 公司。 table 用户与 table 公司有关系 1:1。每个用户都在一家公司。 table 公司有列 "schema" (varchar(255))

架构 "S" 定义了 table 用户和 table 公司。每个其他模式都应该有 table 用户的副本。

但是 table 用户仅在模式 S 上被修改。

每次 table Users in Schema "S" 被修改时,我想将更改复制到架构 'n' IF 且仅当列 "schema" 在 table "Company" == 'n'.

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

啊是的:

例子

考虑 Table 用户有以下列:

考虑 table 公司有以下列:

当我在架构 "S" 上对用户 table 进行插入时,我希望发生以下情况:

    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

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

我对 Hybernate 一无所知,但考虑到您只希望这些表成为 read-only,视图可能会起作用。尝试类似下面的内容(由于问题中缺乏详细信息,一些名称被篡改)代替公司表的 CREATE TABLE 语句。

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

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