如何设置触发器以从另一个模式插入另一个表?
简要说明
考虑模式“ 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>
此限制使该问题不同于其他问题!
是的:
示例
考虑表用户具有以下列:
Id-int
用户名-Varchar(255)
dateBirth-日期
idCompany-FK int
考虑表Company包含以下列:
当我在模式“ 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
答案 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';
如果可行,它将节省所有复制开销。