2013-09-30 79 views
-1

我有一個Java程序來更新SQL表(id, name, status)。整個表格使用相同的數據或一些更改的數據進行更新。我如何跟蹤一行是否與更新前相同或者它有一些修改後的數據? id始終是相同的,只有名字上的小錯字。我只是想檢查下一次更新,如果名稱被修改。在這種情況下,狀態字段應該從「相同」更改爲「修改」。時間戳會解決我的問題嗎?請幫忙。SQL更新軌道更改

+0

MySQL是不是SQL服務器 – podiluska

回答

0

SQL Server在表級別上沒有版本控制。如果要跟蹤兩個字段之間的差異,至少有兩個選項:

  1. 從您的Java應用程序進行控制 - 在更新方法中執行更新前檢查。從SQL Server
  2. 控制 - 更新前的檢查

您還可以創建suplimentary場,其中版本號將保持

0

是的,你可以使用時間戳再寫觸發。 通過使用時間戳,您可以找到表中的最新條目,並通過在查詢中使用按時間戳順序,您可以獲取最新的並根據相應的值設置狀態

0

這取決於您有多少信息需要。如果您關心的是記錄是否曾被修改過,則可以使用created_when和updated_when字段。如果後者大於前者,則已更新。

如果您想知道哪些字段已更新,您必須記錄更改。細節取決於您的要求。如果您需要記錄更改,觸發器是執行此操作的最佳方法。

1

1 - 如果您正在審計表(插入,更新,刪除),請查看我如何防止不需要的交易幻燈片組w/code - http://craftydba.com/?page_id=880

看完代碼!

填充審計表的觸發器可以保存來自多個表的信息,因爲數據保存爲XML。因此,您可以根據需要取消刪除。它追蹤誰和做了什麼改變。

2 - 如果您永遠不會清除審計表中的數據,爲什麼不將該行標記爲已刪除,而是永久保留它?

許多像人一樣的軟件系統使用有效的約會來顯示記錄是否不再有效。在BI世界中,這被稱爲類型2維表(緩慢變化的維度)。

查看數據倉庫學院的文章。 http://www.bidw.org/datawarehousing/scd-type-2/ 每條記錄​​都有開始日期和結束日期。所有活動記錄的結束日期都爲空。

3 - Micorsoft SQL Server引入了更改數據捕獲功能。儘管事實上這使用LOG讀取器來跟蹤數據更改,但它缺少像是誰以及是否進行了更改等事情。

再次,所有上述解決方案的工作。我偏愛我的解決方案!

真誠

約翰

狡猾的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