sql-server - 更新触发器后将旧记录插入另一个表

标签 sql-server t-sql triggers

我有 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/

相关文章:

mysql - 如何获取 SQL 文件并将其导入到 Rails Active Record 基本连接中?

sql - 如何折叠 t-sql 中空值的行?

sql-server - 如何删除**IN**查询Sql中的冗余条件

mysql - 触发器阻止记录插入

sql-server - 如何将数据源 View 和基于它的报表模型的源更改为不同的数据库?

Python PYDOBC 使用参数插入 SQL Server DB

c# - 插入、选择和更新日期时间

sql - 运行后取消主触发器(更新后)触发器类型

javascript - 在执行任何函数之前执行一个函数

sql-server - 将 CSV 从 Azure blob 加载到 Azure SQL 的 SSIS 步骤