Sql-Server

觸發器未更新

  • May 7, 2020

我的語法有問題嗎?我創建了這個觸發器,因為有時銷售人員忘記輸入銷售日期(我知道它應該被自動擷取,這是一個正在進行的更新)但我們仍然看到表中的幾行具有空saledatesaledateGetDate()什麼時候更新欄位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

最後,請始終使用模式前綴

引用自:https://dba.stackexchange.com/questions/131227