【问题标题】:After Update Trigger Insert old records to another table更新触发器后将旧记录插入另一个表
【发布时间】:2018-09-27 12:46:05
【问题描述】:

我有 MedicalAllowance 表我想将此表中的 vesrion 作为历史表“MedicalAllowanceHistory”我想在更新后创建触发器来执行此操作 MedicalAllowance Table 将数据复制到“MedicalAllowanceHistory”表中。哪种方式更好。

医疗津贴表

ID | Employee_ID | Limit | Used | Balance

MedicalAllowanceHistory 表

ID | Employee_ID | Limit | Used | Balance

【问题讨论】:

  • 请解释一下您这样做的目的是什么?您想这样做以记录“MedicalAllowanceHistory”或其他任何用法吗?
  • 我会告诉你使用最佳实践来审计和跟踪表,但我不知道你的要求也不知道你的 SQL Server 版本。但是你应该看看这个链接:stackoverflow.com/questions/17546601/…
  • 我建议您提供比旧值更多的详细信息。否则,您将永远无法计算出值随时间的变化。
  • 在可以确定的范围内,至少记录更改的日期/时间和用户可能是有意义的。对于大多数应用程序来说,拥有一包没有顺序的历史记录行并不是很有用。

标签: sql-server tsql triggers


【解决方案1】:

您可以为此使用触发器
但我也会存储事件的日期和事件的类型(插入、更新或删除)
这是一个帮助您入门的示例

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 表中。
在这种情况下,update 部分可能看起来像这样

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

【讨论】:

    【解决方案2】:

    我建议您使用“更改数据捕获”而不是“触发器”。在此解决方案中,SQL 跟踪任何更改。如果您需要了解更多,请点击here

    【讨论】:

      【解决方案3】:

      您可以使用以下示例来解决您的问题:

      CREATE TRIGGER tg_MedicalAllowance ON MedicalAllowance
      AFTER UPDATE, INSERT, DELETE
      AS
      BEGIN
        INSERT MedicalAllowanceHistory
        SELECT ID,Employee_ID,Limit,Used,balance
        FROM deleted
      END
      

      【讨论】:

      • 更新将如何工作?这是一个INSERT 触发器。
      • 这并不能解决问题。 insertednew 数据,因此您只有 2 个最新版本的副本(这将丢失初始版本)。仅复制列而不添加其他元数据也无助于可追溯性。
      • 我将 inserted 更改为 deleted,并添加了 AFTER INSERT, UPDATE, DELETE,因为我相信这就是 Kesava 的意图。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-07
      • 2020-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多