2017-01-16 60 views
-1

考慮下面的例子,其中我有一個表和相應的視圖:插入在基礎表一個不同的值,當一個視圖被更新

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一個nd 0內部有效列的基礎表。

請注意,我無法更改表或查詢。不過,我可以在表格中添加「正常」列。

+0

rü尋找額外的更新查詢,將有效轉換爲1和無效轉換爲0? –

+0

你能提供你的視圖定義嗎? – Tanner

+0

@Tanner該視圖僅僅是主表中的列的子集,但它有一個WHERE子句。 –

回答

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 

請注意,您必須包括所有可以在您的更新語句中的視圖更新的列,否則他們將不會被更新。

+0

我是否需要在視圖中包含id列? –

+1

你已經將它包括在問題中了......但是,視圖必須包含一個行標識符(不必是單個列,具有唯一索引的任何東西就足夠了) –

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 
相關問題