Mysql 跟踪sql行中的更改以进行更新

Mysql 跟踪sql行中的更改以进行更新,mysql,sql,sql-server,timestamp,unix-timestamp,Mysql,Sql,Sql Server,Timestamp,Unix Timestamp,我有一个java程序来更新SQL表(id、name、status)。使用相同的数据或某些更改的数据更新整个表。如何跟踪行是否与更新前相同,或者是否有一些修改过的数据?id总是一样的,只是名字上的小错误。如果名称被修改,我只想检查下一次更新。在这种情况下,状态字段应从“相同”更改为“已修改”。时间戳能解决我的问题吗?请帮忙 SQL Server在表级别没有版本控制。如果要跟踪两个字段之间的差异,至少有两个选项: 来自Java应用程序的控件-在更新方法中执行更新前检查 来自SQL Server的控件

我有一个java程序来更新SQL表(
id、name、status
)。使用相同的数据或某些更改的数据更新整个表。如何跟踪行是否与更新前相同,或者是否有一些修改过的数据?id总是一样的,只是名字上的小错误。如果名称被修改,我只想检查下一次更新。在这种情况下,状态字段应从“相同”更改为“已修改”。时间戳能解决我的问题吗?请帮忙

SQL Server在表级别没有版本控制。如果要跟踪两个字段之间的差异,至少有两个选项:

  • 来自Java应用程序的控件-在更新方法中执行更新前检查
  • 来自SQL Server的控件-再次写入触发器以进行更新前检查

  • 您还可以创建将保留版本号的补充字段

    是的,您可以使用时间戳。
    通过使用时间戳,您可以找到表中最新的条目,通过在查询中使用按时间戳排序,您可以获得最新的条目,并根据相应的值设置状态,这取决于您需要多少信息。如果您只关心记录是否曾经被修改过,那么可以使用created_when和updated_when字段。如果后者大于前者,则已更新


    如果您想知道哪些字段已更新,则必须记录更改。细节取决于您的要求。如果您需要记录更改,触发器是最好的方法。

    1-如果您希望审核表(插入、更新、删除),请查看我的“如何防止不必要的事务”幻灯片组w/code-

    请参见末尾的代码

    填充审核表的触发器可以保存来自多个表的信息,因为数据保存为XML。因此,如果需要,可以取消删除。它跟踪谁以及是什么做出了改变

    2-如果您永远不会从审核表中清除数据,为什么不将该行标记为已删除,但将其永久保留

    许多系统如people soft使用有效的约会来显示记录是否不再活跃。在BI世界中,这称为类型2维表(缓慢变化的维度)

    请参阅数据仓库协会的文章。 每个记录都有开始和结束日期。所有活动记录的结束日期均为空

    3-Micorsoft SQL Server引入了更改数据捕获功能。虽然这会在事后使用日志读取器跟踪数据更改,但它缺少诸如是谁以及是什么进行了更改之类的内容

    同样,上述所有解决方案都有效。我偏爱我的解决方案

    诚恳

    约翰

    狡猾的DBA

    -- 
    -- 7 - Auditing data changes (table for DML trigger)
    -- 
    
    
    -- Delete existing table
    IF OBJECT_ID('[AUDIT].[LOG_TABLE_CHANGES]') IS NOT NULL 
      DROP TABLE [AUDIT].[LOG_TABLE_CHANGES]
    GO
    
    
    -- Add the table
    CREATE TABLE [AUDIT].[LOG_TABLE_CHANGES]
    (
      [CHG_ID] [numeric](18, 0) IDENTITY(1,1) NOT NULL,
      [CHG_DATE] [datetime] NOT NULL,
      [CHG_TYPE] [varchar](20) NOT NULL,
      [CHG_BY] [nvarchar](256) NOT NULL,
      [APP_NAME] [nvarchar](128) NOT NULL,
      [HOST_NAME] [nvarchar](128) NOT NULL,
      [SCHEMA_NAME] [sysname] NOT NULL,
      [OBJECT_NAME] [sysname] NOT NULL,
      [XML_RECSET] [xml] NULL,
     CONSTRAINT [PK_LTC_CHG_ID] PRIMARY KEY CLUSTERED ([CHG_ID] ASC)
    ) ON [PRIMARY]
    GO
    
    -- Add defaults for key information
    ALTER TABLE [AUDIT].[LOG_TABLE_CHANGES] ADD CONSTRAINT [DF_LTC_CHG_DATE] DEFAULT (getdate()) FOR [CHG_DATE];
    ALTER TABLE [AUDIT].[LOG_TABLE_CHANGES] ADD CONSTRAINT [DF_LTC_CHG_TYPE] DEFAULT ('') FOR [CHG_TYPE];
    ALTER TABLE [AUDIT].[LOG_TABLE_CHANGES] ADD CONSTRAINT [DF_LTC_CHG_BY] DEFAULT (coalesce(suser_sname(),'?')) FOR [CHG_BY];
    ALTER TABLE [AUDIT].[LOG_TABLE_CHANGES] ADD CONSTRAINT [DF_LTC_APP_NAME] DEFAULT (coalesce(app_name(),'?')) FOR [APP_NAME];
    ALTER TABLE [AUDIT].[LOG_TABLE_CHANGES] ADD CONSTRAINT [DF_LTC_HOST_NAME] DEFAULT (coalesce(host_name(),'?')) FOR [HOST_NAME];
    GO
    
    
    
    --
    --  8 - Make DML trigger to capture changes
    --
    
    
    -- Delete existing trigger
    IF OBJECT_ID('[ACTIVE].[TRG_FLUID_DATA]') IS NOT NULL 
      DROP TRIGGER [ACTIVE].[TRG_FLUID_DATA]
    GO
    
    -- Add trigger to log all changes
    CREATE TRIGGER [ACTIVE].[TRG_FLUID_DATA] ON [ACTIVE].[CARS_BY_COUNTRY]
      FOR INSERT, UPDATE, DELETE AS
    BEGIN
    
      -- Detect inserts
      IF EXISTS (select * from inserted) AND NOT EXISTS (select * from deleted)
      BEGIN
        INSERT [AUDIT].[LOG_TABLE_CHANGES] ([CHG_TYPE], [SCHEMA_NAME], [OBJECT_NAME], [XML_RECSET])
        SELECT 'INSERT', '[ACTIVE]', '[CARS_BY_COUNTRY]', (SELECT * FROM inserted as Record for xml auto, elements , root('RecordSet'), type)
        RETURN;
      END
    
      -- Detect deletes
      IF EXISTS (select * from deleted) AND NOT EXISTS (select * from inserted)
      BEGIN
        INSERT [AUDIT].[LOG_TABLE_CHANGES] ([CHG_TYPE], [SCHEMA_NAME], [OBJECT_NAME], [XML_RECSET])
        SELECT 'DELETE', '[ACTIVE]', '[CARS_BY_COUNTRY]', (SELECT * FROM deleted as Record for xml auto, elements , root('RecordSet'), type)
        RETURN;
      END
    
      -- Update inserts
      IF EXISTS (select * from inserted) AND EXISTS (select * from deleted)
      BEGIN
        INSERT [AUDIT].[LOG_TABLE_CHANGES] ([CHG_TYPE], [SCHEMA_NAME], [OBJECT_NAME], [XML_RECSET])
        SELECT 'UPDATE', '[ACTIVE]', '[CARS_BY_COUNTRY]', (SELECT * FROM deleted as Record for xml auto, elements , root('RecordSet'), type)
        RETURN;
      END
    
    END;
    GO
    

    Mysql不是SQL Server