2014-09-29 36 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 
相关问题