2016-04-01 28 views
2

我已經研究了很多,但找不到我想要的 - (我對SQL中的TRIGGERS有淺薄的知識 - 原諒我!)更新我的「插入」觸發器中的「插入」列 - 有點不同

QN:我所有的三個觸發器在我的表(INSERT,UPDATE &刪除) 在我的AFTER INSERT觸發器:我需要「更新」中的「插入」欄 和我所用:

UPDATE Table_name 
SET Column_name = @Input 
(currently) 

但我被要求使用類似於:

UPDATE "Inserted.column_name" 
SET Column_name = @Input 

但是這是它會引發我一個錯誤一般是不可能發生的:

The logical tables INSERTED and DELETED cannot be updated

有人能幫助我嗎?

我已經看到使用INSTEAD OF TRIGGER的帖子,但這並不符合我的目的..在此先感謝!感謝你的幫助!

+0

你需要更新*你的底層表* - 而不是'插入的'僞表。通過主鍵上的Inserted僞表加入你自己的表,然後更新受此觸發器影響的**實際表** –

+0

我已經在我的psuedo表上寫入了聯接..但是,是否可以進一步顯示請舉例嗎?我已經寫了加入像這樣UPDATE TABLE_NAME \t \t \t \t \t \t SET \t \t \t \t [COL_NAME] = @input \t \t \t從表T3 \t \t \t JOIN插在t.Primary_key = INSERTED.Id – dotnetlover

回答

0

您需要更新實際,基礎表 - 而不是Inserted僞表....

你需要加入主鍵的表,然後更新您的實際數據表 - 像

CREATE TRIGGER trg_Insert_Sample 
ON dbo.YourTableName 
AFTER INSERT 
AS 
    UPDATE dbo.YourTableName 
    SET SomeColumn = i.SomeValue 
    FROM Inserted i 
    WHERE dbo.YourTableName.PrimaryKey = i.PrimaryKey 

或沿着這些線路的東西....

需要注意的是,扳機被稱爲每條語句一次 - 不是每行一次 - 因此,如果您的INSERT語句一次插入10行(例如,一SELECT),您的觸發器被稱爲一次,並Inserted將包含10行 - 所以你需要確保你的觸發器代碼能夠處理這種情況,是寫在一個適當的,基於集的方式(無SELECT @Value = SomeColumn FROM Inserted - 這是行不通的!)