2014-09-29 38 views
0

我有一個簡單的表在我的SQL Server 2012數據庫什麼方法可以讓我的數據庫在更新表或行被刪除時創建歸檔條目?

CREATE TABLE [dbo].[Content] (
    [ContentId]  INT   IDENTITY (1, 1) NOT NULL, 
    [SubjectId]  INT   NOT NULL, 
    [Title]   NVARCHAR (50) NOT NULL, 
    [Text]   NVARCHAR (MAX) NOT NULL, 
    [Version]   ROWVERSION  NOT NULL, 
    [CreatedBy]  INT   NOT NULL, 
    [CreatedDate]  DATETIME  NOT NULL, 
    [ModifiedBy]  INT   NOT NULL, 
    [ModifiedDate] DATETIME  NOT NULL, 
    CONSTRAINT [PK_Content] PRIMARY KEY CLUSTERED ([ContentId] ASC) 
); 
GO 
CREATE NONCLUSTERED INDEX [Content_Subject_IX] 
    ON [dbo].[Content]([SubjectId] ASC); 
GO 

如果在此表用戶編輯或刪除數據,則所有的更改都將丟失。我真正喜歡的是以某種方式保留更改。

任何人都可以給我任何建議或指向我一個可能的解決方案。我接受任何建議,並歡迎一些想法。例如,創建一個歸檔表是否合理,如果我這樣做了,那麼我怎樣才能從數據庫中填充該表。有一個簡單的方法,我可以用觸發器做到這一點?

我希望有人能指出我正確的方向。我沒有DBA來徵求建議,所以我會很感激任何建議。

+0

如果要保留所有數據,爲什麼用戶允許編輯現有信息,爲什麼不每次都簡單地添加新記錄? – 2014-09-29 12:40:01

+0

我希望向用戶顯示當前數據,但允許管理員進入,編輯和更新備份以防管理員犯了錯誤。 – 2014-09-29 12:45:14

+0

您可以設置SQL Server每天對數據庫進行備份,以防萬一有什麼不好的事情發生時有人可以恢復最新的備份。 – 2014-09-29 13:26:25

回答

0

你可以用觸發器做到這一點,但我最喜歡的解決方案是隻做「軟刪除」。

軟刪除意味着您添加一個列,稱爲「DeletedOn」的稱爲「Deleted」或日期時間列(我的fav)的位類型。

當用戶「刪除」一行,而不是實際刪除它時,填充該列。在查詢表格時,總是過濾掉「DeletedOn」不爲空的行。行被有效刪除,但它們仍然存在歷史用途。

我看到你已經有了「ModifiedBy」和「ModifiedOn」。所以你可能會考慮「DeletedBy」和「 DeletedOn」。

1

如果您擁有企業版SQL Server,則可以使用更改數據捕獲來保存更改的完整歷史記錄。從官方文檔(Change Data Capture):

更改數據捕獲通過捕獲DML更改和更改的實際數據這一事實來提供用戶錶的歷史更改信息。通過使用讀取事務日誌並對系統影響較小的異步進程來捕獲更改。

+0

我正在使用SQL Server 2012的SQL Azure版本,所以不幸我不認爲這存在。 – 2014-09-29 13:29:28

+0

@Adolfo Socorro'更改數據捕獲'僅適用於企業版,開發人員版和企業評估版。 – Rajesh 2014-09-30 04:40:48

0

如果其沒有可能與Change Data Capture那麼你可以使用CONTEXT_INFOTriggers更新或刪除像

DECLARE @ID int,@CONTEXT_INFO varbinary(128) 

SET @ID = 10 
SET @CONTEXT_INFO =cast('ID='+CONVERT(varchar(10),@ID) 
+REPLICATE(' ',128) as varbinary(128)) 
SET CONTEXT_INFO @CONTEXT_INFO 

--do Update/Delete that will fire the trigger 

SET CONTEXT_INFO 0x0 

這裏之前存檔的數據是觸發的檢索值的部分:

Create Trigger UpdDel 
on Cuttingissue 
Instead of Update,Delete 
as 
Begin 
Begin Try 

DECLARE @ID  int 
     ,@sCONTEXT_INFO varchar(128) 
SELECT @sCONTEXT_INFO=CAST(CONTEXT_INFO() AS VARCHAR) 
FROM master.dbo.SYSPROCESSES WHERE [email protected]@SPID 

IF LEFT(@sCONTEXT_INFO,9)='ID' 
BEGIN 
    SET @ID=RIGHT(RTRIM(@sCONTEXT_INFO),LEN(RTRIM(@sCONTEXT_INFO))-10) 
END 
ELSE 
BEGIN 
    RAISERROR('ID was not specified',16,1) 
    ROLLBACK TRAN 
    RETURN 
END 
    Insert into Backup_tbl(Pktno,EType,Clg,Class,[Subject],Totscripts,Flag,CiDate) 
    Select Pktno,EType,Clg,Class,[Subject],Totscripts,Flag,CiDate 
    from Cuttingissue where [email protected] 

/* Do Your Update/Delete here */ 

End Try 
Begin Catch 
Declare @ErrMsg Nvarchar(max),@Errseverity int 
Set @ErrMsg=ERROR_MESSAGE() 
Set @Errseverity=ERROR_SEVERITY() 

Raiserror(@ErrMsg,@Errseverity,1) 

End Catch 
End 
相關問題