Sql-Server
觸發器未更新
我的語法有問題嗎?我創建了這個觸發器,因為有時銷售人員忘記輸入銷售日期(我知道它應該被自動擷取,這是一個正在進行的更新)但我們仍然看到表中的幾行具有空
saledate
值saledate
用GetDate()
什麼時候更新欄位saledate is null
?我想在插入或更新上執行它create trigger updatefield on salerecords for insert, update as begin update salerecords set saledate = getdate() where saledate Is null end
觸發器的一個問題是它可能會更新表中的所有行,即使只更新或插入了一行。如果有人不小心將這些值設置為 NULL,那麼它們將在下次觸發器執行時更新為目前時間。這對您的應用程序有意義嗎?我認為不理會過去的值更有意義(單獨處理這些值,儘管仍然存在似乎值得懷疑),並且只需要更新目前受觸發器直接影響的行。您可以通過加入
inserted
偽表來做到這一點:UPDATE sr SET saledate = GETDATE() FROM dbo.salerecords AS sr INNER JOIN inserted AS i ON sr.key_column = i.key_column -- you'll need to update this WHERE sr.saledate IS NULL;
也就是說,我同意@SoleDBAGuy的觀點,他提出了一個預設約束。以下是如何實現它:
ALTER TABLE dbo.salerecords ADD CONSTRAINT df_saledate DEFAULT (GETDATE()) FOR saledate; GO ALTER TABLE dbo.salerecords ALTER COLUMN df_saledate datetime NOT NULL;
然後放下扳機。請注意,第二個命令可能會失敗;如果您在那裡已經有空值,那麼很難證明只是將它們“現在”作為銷售日期,而此時它們可能已有數年之久。因此,您可以單獨查看這些內容,也可以將某個日期應用於所有內容,例如:
UPDATE dbo.salerecords SET saledate = GETDATE(); -- or UPDATE dbo.salerecords SET saledate = '19000101'; -- beware magic number
最後,請始終使用模式前綴。