是的,您可以通过使用 INSTEAD OF 触发器对旧版本的视图进行插入、更新和删除操作来做到这一点。为了更清楚地说明这一点,让我们考虑以下示例:
v1:
A(id int, data varchar(30))
B(id int, a_id int, data varchar(30))
v2:
A(id int, data varchar(30))
B(id int, data varchar(30), data2 varchar(20))
AB(a_id int, b_id int)
首先,您将创建一个视图来模仿旧版本的 B 表。棘手的事情是决定向旧应用程序显示哪个 AB 关系。一种选择是将bit 类型的primary_b 列添加到AB 表中。下面的视图使用了这个选项
CREATE VIEW OldB AS
SELECT B.id AS id, AB.a_id AS a_id, B.data AS data,
FROM B INNER JOIN AB ON B.id = AB.b_id
WHERE AB.primary_b = 1
接下来,您将在视图上创建触发器来处理插入和更新。
CREATE TRIGGER InsertTrigger on OldB INSTEAD OF INSERT
AS
BEGIN
INSERT INTO B (id, data) SELECT id, data FROM inserted;
UPDATE AB SET primary_b = 0 WHERE b_id IN (SELECT id FROM inserted);
INSERT INTO AB (a_id, b_id, primary_b) SELECT a_id, id, 1 FROM inserted;
END
GO
您将执行类似的操作而不是更新,但您必须通过删除和添加 AB 中的行来管理 A 到 B 链接中的更改。我尚未检查此代码是否有错误,但我会在接下来的一个小时左右,并在需要时发布更新。