需要注意的一點是很多人會出錯:SQL Server中的觸發器被稱爲每個語句一次 - 不是每行一次。您的觸發器將被稱爲一次,以及(在UPDATE情況下Inserted
和Deleted
)僞表將包含50行 - 如果你碰巧有一個INSERT
或UPDATE
語句插入或更新一次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
非常感謝您,我從您的回覆中瞭解到很多。我正在實施它,會讓你知道它是如何發展的。感謝您指出整個批次已更新的事實,而不僅僅是一行。這是我在這個狹隘的方法中忽略的東西。 – user2100137 2013-03-01 20:32:43
@ user2100137:很高興能有所幫助! – 2013-03-01 22:07:03