2012-05-12 67 views
4

我發現在sql server中只有after和instead的觸發器。修改插入的pesudo表中的值是非法的。然後我的問題發生:如果我想檢查將要插入到我的表中的數據,並且當數據違反我的約束時,我應該將這些值修改爲默認值,如何執行?如何在插入後更新值?但是,如果我的表中沒有唯一的主鍵或柱,那麼我如何才能找到剛插入的行然後更新它?T-SQL如何在插入之前修改值

+2

「INSTEAD OF」觸發器的一點是可以「捕獲」該操作(例如'INSERT'),然後執行某些操作*而不是正常操作。所以你可以讀出數值,修改它們,然後在INSTEAD OF INSERT觸發器中調用INSERT來插入修改過的數據 –

+0

問題是,如果表格結構發生變化,你需要考慮修改觸發器也是如此。相反,Oracle可以更新更符合邏輯的'插入'對象('新')的等價物。 –

回答

11

基本上與INSTEAD OF INSERT扳機,就可以實現你在找什麼 - 只是宣讀了INSERTED僞表中的數據,修改它,並把它插入到表

所以,你的觸發器將看像這樣:

CREATE TRIGGER YourTrigger ON dbo.YourTable  
INSTEAD OF INSERT 
AS 
    SET NOCOUNT ON 

    -- do the INSERT based on the INSERTED pseudo table, modify data as needed 
    INSERT INTO dbo.YourTable(Col1, Col2, ....., ColN) 
     SELECT 
      Col1, 2 * Col2, ....., N * ColN 
     FROM 
      INSERTED 

當然,你也可以添加例如以WHERE子句的形式檢查該SELECT .... FROM INSERTED陳述,例如忽略某些行 - 可能性無窮無盡!

+0

非常感謝。真的行。 :-) – tmj

相關問題