我正在使用 PostgreSQL 视图来模拟一个遗留表,该表已被拆分为两个单独的表,因此我们可以保持与一系列服务的向后兼容性。目标本质上是让这个视图透明地运行,就好像它是拆分前的原始表一样。使用INSTEAD OF INSERT
触发器,我已经能够很容易地处理插入两个表的操作。
但是我正在努力弄清楚如何编写INSTEAD OF UPDATE
触发器,因为我不知道在任何一个请求中哪些列会被更改(我正在使用 sequelize 所以我真的没有任何方法来控制请求是什么将是,它可能是SET
单个列,也可能是所有列)。我在网上找到的所有示例似乎都在更新已知字段(与查询相关的一些元列或知道更新的形状将是什么)。
CREATE FUNCTION update_legacy_table_trigger()
RETURNS trigger AS $$
BEGIN
UPDATE table_a SET ??? WHERE id = NEW.id;
UPDATE table_b SET ??? WHERE table_a_id = NEW.id;
END;
$$ LANGUAGE plpgsql;
几个例子:
想象:
legacy_table
是视图的名称table_a
有以下列:id
,name
,description
,type
,shared_column
和table_b
有以下列:id
,table_a_id
(外键table_a
),price
,shared_column
.
示例 A:
UPDATE legacy_table SET name="Test", price="10.00" WHERE id="123";
我希望触发器的行为类似于:
UPDATE table_a SET name="Test" WHERE id="123";
UPDATE table_b SET price="10.00" WHERE table_a_id="123";
示例 B:它也可以只接收一张表的更新
UPDATE legacy_table SET price="10.00" WHERE id="123";
所以我们希望触发器的行为类似于:
UPDATE table_b SET price="10.00" WHERE table_a_id="123";
示例 C:一个请求中可能有很多列
UPDATE legacy_table SET name="Test", price="10.00", description="A test", type="foo", shared_column="bar" WHERE id="123";
所以触发器的行为应该像:
UPDATE table_a SET name="Test", description="A test", type="foo", shared_column="bar" WHERE id="123";
UPDATE table_b SET price="10.00", shared_column="bar" WHERE table_a_id="123";
可能存在需要对两个表进行更新的情况,但我不相信在任何情况下原始列UPDATE
的名称与新表中的列名称有任何不同。
INSTEAD OF UPDATE
在我不明确知道 UPDATE 查询是什么的情况下,我将如何编写此触发器?