mysql - 如何设置触发器以从另一个模式插入另一个表?
问题描述
如何设置触发器以从另一个模式插入另一个表?
简要说明
考虑模式“S”和模式“1”到“n”。考虑模式“S”具有表用户和表公司。表 users 与表 Company 具有 1:1 的关系。每个用户都在一家公司。表公司有列“模式”(varchar(255))
模式“S”定义了表用户和表公司。每个其他模式都应该有表用户的副本。
然而,表用户仅在模式 S 上被修改。
每次修改模式“S”中的表用户时,我想将更改复制到模式“n”IF 并且仅当表“公司”== 'n' 中的列“模式”。
这个限制使这个问题与其他问题不同!
是的:
- 所有模式都保留在同一个数据库中。
例子
考虑表用户具有以下列:
ID - 整数
用户名 - Varchar(255)
dateBirth - 日期
idCompany - FK int
考虑公司表有以下列:
- ID - 整数
- 架构 - Varchar(255)
当我在模式“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
解决方案
您将需要使用动态 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
推荐阅读
- scala - Constructor.newInstance 替换 Scala 对象
- machine-learning - 将多个模型的输出与 CTC 输出层相结合(集成)
- visual-c++ - 为什么 [ebp-8] 是 Visual C++ 中第一个局部变量的位置?
- android - 是否可以将两个不同的应用程序上传到具有高度相似代码库的 Apple Store 和 Play Store?
- redirect - Laravel 重定向到带有参数的命名路由返回状态 200
- bash - 每天保留一个文件,一个 3 天和 1 周,并删除其他文件
- angular - 没有为作者字段触发角度表单验证
- c# - 如何从 OkObjectResult 获取动态属性
- github - 如何使用 Pygithub API 执行“拉”命令
- c# - 为什么这个 XPath 表达式适用于一个节点而不适用于另一个节点?