更新视图时,在基础表中插入不同的值

时间:2017-01-16 11:06:06

标签: sql sql-server sql-server-2012 views

考虑以下示例,其中有一个表和相应的视图:

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;

是否可以更新基础表格,以便 状态 validinvalid存储为1和{ {1}}在基础表的 有效 列中。

请注意,我无法更改表或查询。但是我可以在表格中添加“普通”列。

2 个答案:

答案 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语句的视图中包含可以更新的所有列,否则它们将不会更新。

相关问题