我撰寫了一個觸發器,每當另一列 (productionDate) 的值從 null 更改時計算列的值 (expiryDate),我的教授告訴我應該使用存盤程序:
create or alter trigger tg_expiry_date
on product
after insert, update
as
begin
if exists (select productionDate
from inserted as i
where productionDate is not null)
begin
begin try
declare @orderId int = ( select max(orderId) -- avoids updating previously inserted rows
from inserted )
declare @date date = ( select productionDate
from inserted
where orderId = @orderId )
begin tran
update product
set expiryDate = ( select dateadd(day, 90, @date) -- adds 90 days to the production date
from inserted
where orderId = @orderId
)
where orderId = @orderId
commit tran
end try
begin catch
if @@trancount > 0
begin
rollback tran
exec usp_showerrorinfo
end
end catch
end
end
go
不過,我不太同意她的建議。每次值變化時使用一個程序可能太乏味了,應該自動計算。她為什么要這么告訴我?我想它可能有點意大利面條式的代碼,并且maxin 不set應該存在,但我不知道如何實作它。
uj5u.com熱心網友回復:
只需添加一個計算列,非常適合這種情況。
alter table product drop column ExpiryDate;
go
alter table product add ExpiryDate as dateadd(day, 90, productionDate);
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/489858.html
上一篇:EntityFrameworkCore:如何更新沒有重復值的物體?
下一篇:使用更新恢復僅驗證回圈
