如何设置触发器以从另一个模式插入另一个 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 用户有以下列:
Id - 整数
用户名 - Varchar(255)
出生日期 - 日期
idCompany - FK int
考虑 table 公司有以下列:
- Id - 整数
- 架构 - Varchar(255)
当我在架构 "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';
如果这可行,它将节省所有复制开销。
如何设置触发器以从另一个模式插入另一个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 用户有以下列:
Id - 整数
用户名 - Varchar(255)
出生日期 - 日期
idCompany - FK int
考虑 table 公司有以下列:
- Id - 整数
- 架构 - Varchar(255)
当我在架构 "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';
如果这可行,它将节省所有复制开销。