考虑以下示例,其中有一个表和相应的视图:
Table | View
T_EmailAddress | V_EmailAddress
----------------+----------------
ID INT | ID
Status VARCHAR | Status
Valid INT |
Column1 VARCHAR | Column1
ColumnN VARCHAR | ColumnN
我有一个发布以下查询的程序:
UPDATE V_EmailAddress SET Status = 'valid' WHERE ID = 1;
UPDATE V_EmailAddress SET Status = 'invalid' WHERE ID = 2;
是否可以更新基础表格,以便 状态 valid
和invalid
存储为1
和{ {1}}在基础表的 有效 列中。
请注意,我无法更改表或查询。但是我可以在表格中添加“普通”列。
答案 0 :(得分:1)
您可以添加UPDATE TRIGGER
:
CREATE TRIGGER T_Valid ON T_EmailAddress
INSTEAD OF UPDATE
AS
BEGIN
UPDATE t
SET ID = i.ID
,Valid = CASE WHEN i.Status = 'Valid' THEN 1 ELSE 0 END
,Status = i.Status
,Column1 = i.Column1
,ColumnN = i.ColumnN
FROM T_EmailAddress t
INNER JOIN ON INSERTED i
ON t.ID = i.ID
END
GO
或者,您可能希望将Valid
列替换为计算列:
ALTER TABLE T_EmailAddress
DROP COLUMN Valid
ALTER TABLE T_EmailAddress
ADD Valid AS (CASE WHEN Status = 'Valid' THEN 1 ELSE 0 END) PERSISTED
答案 1 :(得分:1)
您可以在视图上使用而不是更新触发器。 如果视图上的更新语句将完成,则触发器将触发。请注意,而不是触发器意味着将阻止更新,并且您必须自己将更新语句写入底层表。
这些方面的东西应该可以解决问题:
CREATE TRIGGER V_EmailAddress_IO_Update ON V_EmailAddress
INSTEAD OF UPDATE
AS
BEGIN
UPDATE t
SET Column1 = i.Column1,
ColumnN = i.ColumnN,
Valid = CASE WHEN i.[Status] = 'valid' THEN 1 ELSE 0 END
FROM inserted i
INNER JOIN T_EmailAddress t ON i.ID = t.ID
END
请注意,您必须在update语句的视图中包含可以更新的所有列,否则它们将不会更新。