我有一個Java程序來更新SQL表(id, name, status
)。整個表格使用相同的數據或一些更改的數據進行更新。我如何跟蹤一行是否與更新前相同或者它有一些修改後的數據? id始終是相同的,只有名字上的小錯字。我只是想檢查下一次更新,如果名稱被修改。在這種情況下,狀態字段應該從「相同」更改爲「修改」。時間戳會解決我的問題嗎?請幫忙。SQL更新軌道更改
-1
A
回答
0
SQL Server在表級別上沒有版本控制。如果要跟蹤兩個字段之間的差異,至少有兩個選項:
- 從您的Java應用程序進行控制 - 在更新方法中執行更新前檢查。從SQL Server
- 控制 - 更新前的檢查
您還可以創建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
相關問題
- 1. 軌道上更新
- 2. 如何更新軌道
- 3. 無法更新軌道
- 4. 軌道更新記錄
- 5. 如何更新MPNowPlayingInfoCenter在後臺和AVQueuePlayer中的軌道更改
- 6. 更改更新語句SQL
- 7. 紅寶石軌道更新模型通過軌道控制檯
- 8. 更改軌道上的URL參數
- 9. 更改軌道中的第一天
- 10. 在軌道中更改時間formate
- 11. Android ExoPlayer更改所選軌道
- 12. 更改複選框以更改在軌道數據庫?
- 13. 如何更新軌道中的數據
- 14. 軌道 - 更新的ActiveRecord列錯誤
- 15. 軌道4 - 柱存在,但不更新
- 16. 軌道4,如果更新已執行
- 17. 無法更新軌道模型
- 18. 軌道4 + Chartkick:更新數據
- 19. 更新軌道中的關聯模型
- 20. extjs編輯器網格更新軌道
- 21. 更新哈希與軌道4
- 22. 軌道計數器緩存更新記錄更新2
- 23. 刷新URL如果URL參數更改軌道
- 24. 更新在軌
- 25. 更好的方式來更新PolyLine軌道的GPS讀數
- 26. 變更軌道從助手
- 27. Rails 3中 - 更「軌道」
- 28. 變更軌道使用RVM
- 29. Autodestroy關於變更軌道
- 30. 軌道4更好的方式來寫軌更新和查找記錄
MySQL是不是SQL服務器 – podiluska