我有 MedicalAllowance 表,我想将此表作为历史表“MedicalAllowanceHistory”,我想创建触发器以在更新后执行此操作 MedicalAllowance 表将数据复制到“MedicalAllowanceHistory”表。哪种方式更好。
医疗津贴表
ID | Employee_ID | Limit | Used | Balance
医疗津贴历史表
ID | Employee_ID | Limit | Used | Balance
最佳答案
您可以使用触发器
但我还会存储事件的日期以及事件的类型(插入、更新或删除)
这是一个帮助您入门的示例
CREATE trigger tr_UID_MedicalAllowance on dbo.MedicalAllowance
after update, insert, delete
as
begin
set nocount on
declare @Insert bit = 0
declare @Update bit = 0
declare @Delete bit = 0
--find out why we where triggered
if (exists(select 1 from inserted)) and (exists(select 1 from deleted))
set @Update = 1
else if (exists(select 1 from inserted))
set @Insert = 1
else if (exists (select 1 from deleted))
set @Delete = 1
if @Update = 1
begin
insert into MedicalAllowanceHistory (
MedicalAllowanceID,
HistoryDate,
HistoryEvent,
other columns...)
select i.MedicalAllowanceID,
getdate(),
'UPDATED',
i.other columns...
from inserted i
end
if @Insert = 1
begin
insert into MedicalAllowanceHistory (
MedicalAllowanceID,
HistoryDate,
HistoryEvent,
other columns...)
select i.MedicalAllowanceID,
getdate(),
'INSERTED',
i.other columns...
from inserted i
end
if @Delete = 1
begin
insert into MedicalAllowanceHistory (
MedicalAllowanceID,
HistoryDate,
HistoryEvent,
other columns...)
select d.MedicalAllowanceID,
getdate(),
'DELETED',
d.other columns...
from deleted d
end
end
还可以在更新时存储旧值和新值,新值位于inserted
表中,旧值位于deleted
表中。< br/>
在这种情况下,更新
部分可能看起来像这样
if @Update = 1
begin
insert into MedicalAllowanceHistory (
MedicalAllowanceID,
HistoryDate,
HistoryEvent,
NewLimit,
OldLimit,
other columns...)
select i.MedicalAllowanceID,
getdate(),
'UPDATED',
i.Limit,
d.Limit,
other columns...
from inserted i
inner join deleted d on i.MedicalAllowanceID = d.MedicalAllowanceID
end
关于sql-server - 更新触发器后将旧记录插入另一个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52537381/