我有一個要求,即在有UPDATE調用時,保留對特定表所做更改的歷史記錄,但只關注特定列。SQL歷史記錄表和觸發器
所以,我創建了一個歷史記錄表:
CREATE TABLE [dbo].[SourceTable_History](
[SourceTable_HistoryID] [int] IDENTITY(1,1) NOT NULL,
[SourceTableID] [int] NOT NULL,
[EventDate] [date] NOT NULL,
[EventUser] [date] NOT NULL,
[ChangedColumn] VARCHAR(50) NOT NULL,
[PreviousValue] VARCHAR(100) NULL,
[NewValue] VARCHAR(100) NULL
CONSTRAINT pk_SourceTable_History PRIMARY KEY ([SourceTable_HistoryID]),
CONSTRAINT fk_SourceTable_HistoryID_History_Source FOREIGN KEY ([SourceTableID]) REFERENCES SourceTable (SourceTableId)
)
阿卜杜勒我的計劃是建立在sourceTable會一個UPDATE觸發器。該業務只關心更改某些列,因此,在psudo代碼,我正打算這樣做
If source.Start <> new.start
Insert into history (PrimaryKey, EventDate, EventUser, ColumnName, OldValue, NewValue)
(PK, GETDATYE(), updateuser, "StartDate", old.value, new.value)
而且會有這樣每列的我們要對歷史塊。
我們不允許使用CDC,所以我們必須推出我們自己的,這是我迄今的計劃。
這似乎是一個合適的計劃?
我們需要監控7個表格,每個表格的列數在2到5列之間。
我只需要弄清楚如何讓一個觸發器首先comapr特定的columnm的前後值,然後寫一個新的行。
我認爲這是簡單的東西:
CREATE TRIGGER tr_PersonInCareSupportNeeds_History
ON PersonInCareSupportNeeds
FOR UPDATE
AS
BEGIN
IF(inserted.StartDate <> deleted.StartDate)
BEGIN
INSERT INTO [dbo].[PersonInCareSupportNeeds_History]
([PersonInCareSupportNeedsID], [EventDate], [EventUser], [ChangedColumn], [PreviousValue], [NewValue])
VALUES
(inserted.[PersonInCareSupportNeedsID], GETDATE(), [LastUpdateUser], 'StartDate', deleted.[StartDate], deleted.[StartDate])
END
END
謝謝ptutt。要獲取歷史數據,對於特定的源記錄,我認爲它會是「SELECT EventUser,EventDate,ChangedColumn,OldValue,NewValue FROM History table WHERE SourceId = x」。這將允許我顯示,「在[Date]上,用戶[User]將列[ColumnChanged]從[OldValue]更改爲[New Value]。 – Craig
根據您的建議,源表和歷史表之間會存在一對多關係嗎? – Mangoose
@Mangus正確。歷史表可以提供數據的快照。 – ptutt