2011-06-23 78 views
0

當新的數據插入到BASETABLE我希望它使視圖(InsteadView)的觸發將數據插入到不同的表。它只適用於我手動將數據插入視圖,但不是當我插入數據到基表。SQL的,而不是在basetable觸發犯規觸發從視圖

CREATE TABLE BaseTable 
    (PrimaryKey  int PRIMARY KEY IDENTITY(1,1), 
    Color   nvarchar(10) NOT NULL, 
    Material  nvarchar(10) NOT NULL, 
    ComputedCol AS (Color + Material) 
) 
GO 

--Create a view that contains all columns from the base table. 
CREATE VIEW InsteadView 
AS SELECT PrimaryKey, Color, Material, ComputedCol 
FROM BaseTable 
GO 

--Create an INSTEAD OF INSERT trigger on the view. 
CREATE TRIGGER InsteadTrigger on InsteadView 
INSTEAD OF INSERT 
AS 
BEGIN 
    --Build an INSERT statement ignoring inserted.PrimaryKey and 
    --inserted.ComputedCol. 
    INSERT INTO anotherTable 
     SELECT Color, Material 
     FROM inserted 
END 
GO 

INSERT INTO BaseTable(顏色,材質 ) VALUES(N'Red 'N'Cloth')

- 查看INSERT語句的結果。 SELECT的PrimaryKey,顏色,材質 ,ComputedCol從另一個表

+0

視圖的觀點是什麼? –

+0

這是一個簡單的例子。真正的觀點是由15個表組成的。如果我能使這個工作,它會幫助我解決真實的問題。 – tdjfdjdj

回答

3

這是事先設計好的。用非數據庫術語來重述您的問題「我爲前門把手充電,但每當我走進後門時,只有當我走進前門時,我纔不會感到震驚。」如果你希望在打開後門的時候得到同樣的震撼,那麼也要給它通電。

觸發器在視圖上定義,因此當您向其中插入數據時,觸發器會熄滅。沒有任何東西在基礎表上定義,如果沒有觸發器觸發。在基表上放置一個而不是觸發器會導致它將數據推送到備用表中,但是您永遠不會獲得數據(除非您執行一些血腥的黑客行爲,例如添加另一列並根據值執行條件邏輯)。

+0

那麼爲什麼會有人想要使用Intead的觸發器?我不想手動將數據插入到我的視圖中。我希望它在我的基礎架構增長時能夠增長,並且在每次插入時觸發器都會寫入另一個表。 – tdjfdjdj

+0

你的意思是你希望你的視圖在基礎架構增長時「增長」?視圖只不過是一個「保存」的查詢。如果您需要修改對象(表/視圖),但不想擔心重構調用代碼,則觸發器非常有用。調用者和數據庫之間的契約仍然有效,但在封面之下,觸發器將數據推入NewTable而不是舊數據庫。至少,這是我必須使用它們的場景。我確信其他人有不同的用例。 – billinkc

+0

如果基本表有20行,我創建的視圖也將有20行。所以我們可以說我有5個表,並且視圖加入了他們的行。然後應用一些算法。現在我想讓該視圖中的新數據寫入新表。你明白爲什麼這很重要,爲什麼我需要從每個插入的視圖中獲取數據? – tdjfdjdj