2013-02-22 45 views
1

的價值我有什麼,我認爲這是一個很簡單的要求,但因爲我是新的,我不能完全得到它正常工作。SQL服務器觸發的插入和/或更新的記錄,根據字段

我有一個完整的客戶資料表的cust_no的PK。當一個新的客戶排插入和電子郵件地址字段不爲空,我想在同一行中設置一個日期字段getdate()

我也想這樣做同樣的事情,如果客戶記錄與新的電子郵件地址更新,但同樣,只有在電子郵件地址字段不爲空,並且實際上新的電子郵件地址進行更新。

這樣做的目的是運行的具體時間範圍內收集新的電子郵件地址的報告。

任何幫助將不勝感激。謝謝!

回答

2

需要注意的一點是很多人會出錯:SQL Server中的觸發器被稱爲每個語句一次 - 不是每行一次。您的觸發器將被稱爲一次,以及(在UPDATE情況下InsertedDeleted)僞表將包含50行 - 如果你碰巧有一個INSERTUPDATE語句插入或更新一次50行

所以。編寫觸發器時需要考慮到這一點。

的INSERT情況比較簡單 - 所以這裏有雲:

-- CREATE after INSERT trigger 
CREATE TRIGGER trgCustomerInsert 
ON dbo.Customer AFTER INSERT 
AS 
    -- update your "Customer" table 
    UPDATE dbo.Customer 
    SET SomeDateColumn = GETDATE() -- set date column to GETDATE() 
    FROM dbo.Customer c 
    INNER JOIN Inserted i ON c.cust_no = i.cust_no -- on all those rows inserted 
    WHERE c.Email IS NOT NULL -- where the e-mail address is NOT NULL 

你基本上只是加入Inserted僞表(包含所有行剛剛插入 - 他們所有的列值)對「真實」客戶表,並更新所有剛剛插入的客戶行,以及電子郵件列的NOT NULL。

更新是有點棘手 - 因爲你只想更新那些電子郵件柱NULL前行,現在是NOT NULL,更新後。因此,您需要加入Deleted僞表,其中包含「舊」值(在UPDATE之前)。

所有已更新的行以及Deleted中的電子郵件的舊值爲NULL且Customer表中的當前值不爲空 - 那些是您要更新日期列的那些行對於。

-- CREATE after UPDATE trigger 
CREATE TRIGGER trgCustomerUpdate 
ON dbo.Customer AFTER UPDATE 
AS 
    -- update your "Customer" table 
    UPDATE dbo.Customer 
    SET SomeDateColumn = GETDATE() -- set date column to GETDATE() 
    FROM dbo.Customer c 
    INNER JOIN Deleted d ON c.cust_no = d.cust_no 
    WHERE 
     -- where new value of e-mail is NOT NULL 
     -- and the old value (in "Deleted") was in fact NULL 
     c.Email IS NOT NULL AND d.EMail IS NULL 
+0

非常感謝您,我從您的回覆中瞭解到很多。我正在實施它,會讓你知道它是如何發展的。感謝您指出整個批次已更新的事實,而不僅僅是一行。這是我在這個狹隘的方法中忽略的東西。 – user2100137 2013-03-01 20:32:43

+0

@ user2100137:很高興能有所幫助! – 2013-03-01 22:07:03