Sql 更新视图时,在基础表中插入其他值
考虑以下示例,其中我有一个表和相应的视图:Sql 更新视图时,在基础表中插入其他值,sql,sql-server,sql-server-2012,views,Sql,Sql Server,Sql Server 2012,Views,考虑以下示例,其中我有一个表和相应的视图: 表|视图 T|u EmailAddress | V|u EmailAddress ----------------+---------------- ID INT | ID 状态VARCHAR |状态 有效整数| 第1列VARCHAR |第1列 ColumnN VARCHAR | ColumnN 我有一个程序发出以下查询: UPDATE V_EmailAddress SET Status = 'valid' WHERE ID = 1; UPDAT
表|视图
T|u EmailAddress | V|u EmailAddress
----------------+----------------
ID INT | ID
状态VARCHAR |状态
有效整数|
第1列VARCHAR |第1列
ColumnN VARCHAR | ColumnN
我有一个程序发出以下查询:
UPDATE V_EmailAddress SET Status = 'valid' WHERE ID = 1;
UPDATE V_EmailAddress SET Status = 'invalid' WHERE ID = 2;
是否可以更新基础表,以便将状态有效
和无效
存储为基础表的有效列中的1
和0
请注意,我无法更改表或查询。但是,我可以向表中添加“普通”列。您可以添加
更新触发器:
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
您可以在视图上使用INSTEADOFUPDATE触发器。
当视图上的update语句完成时,触发器将触发。请注意,而不是触发器意味着更新将被阻止,您必须自己将update语句写入下划线表
沿着这些思路应该可以做到这一点:
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语句中包含视图中可以更新的所有列,否则这些列将不会更新。r您正在查找其他更新查询,若要将valid转换为1,将invalid转换为0?能否提供视图定义?@Tanner视图只是主表中列的子集,但它有一个WHERE子句。因此状态是valid的别名?为什么不在视图上使用instead of update触发器?我是否需要在视图中包含id列?您已经在问题中包含了它。。。但是,是的,视图必须包含行标识符(不必是单个列,任何具有唯一索引的内容都可以)