保留表格的卷影副本,同时保留从原始文档中删除的记录

时间:2013-06-12 10:32:05

标签: sql sql-server

这对于SQL专家来说可能很容易,但SQL(虽然我可以使用它)并不是我的事。

我在DB中有一张桌子。 (我们称之为计算机)
大约10.000行。 25列。 1个唯一键:列资产。

有时外部程序会删除一行或多行,但不应该这样做,因为我们仍然需要知道这些行中的一些信息才能真正删除这些项。

我们无法控制外部应用程序的行为,因此我们想出了一个不同的想法:

我们要创建第二个相同的表格(COMPUTERS_BACKUP),并最初使用计算机的一对一副本填写此表。
之后,每天一次将新记录从COMPUTERS复制到COMPUTERS_BACKUP并更新COMPUTERS_BACKUP中的那些记录,其中COMPUTERS中的原始记录已更改(ASSETS列永远不会更改)。

这样我们就可以从计算机中删除记录的最后一个状态。

有人可以提供可以安排每天运行一次的存储过程的代码吗?我可以自己解决这个问题,但这需要几个小时左右的时间,而且时间紧迫。

5 个答案:

答案 0 :(得分:1)

只为插入计算机表创建一个触发器

CREATE TRIGGER newComputer
ON [Computers]
AFTER INSERT
Begin

INSERT INTO COMPUTERS_BACKUP
  SELECT * FROM Inserted

End

当您将新计算机插入计算机表时它会工作,并且它还会将记录插入到bakcup表中

更新计算机时,您也可以使用更新触发器更改计算机备份

CREATE TRIGGER newComputer
ON [Computers]
AFTER UPDATE
Begin
//can access before updating the record through SELECT * FROM Deleted
//can access after updating the record through SELECT * FROM Inserted
UPDATE Computers_BACKUP SET
 (attributes) = inserted.(attribute)
WHERE id = inserted.id

End

最后,我猜你不想在从电脑桌删除原始记录时删除备份。您可以使用触发器从msdn获取更多示例。

从计算机表中删除记录

CREATE TRIGGER computerDeleted ON [Computers] AFTER DELETE
Begin

INSERT INTO Computers_BACKUP
  SELECT * FROM Deleted

End

答案 1 :(得分:1)

恕我直言可能的解决方案,如果您从未从应用程序中的该表中删除记录(仅更新),可以引入INSTEAD OF DELETE触发器

CREATE TRIGGER tg_computers_delete ON computers
INSTEAD OF DELETE AS
DELETE computers WHERE 1=2;

它将阻止删除记录。

这是 SQLFiddle 演示。

答案 2 :(得分:1)

除了创建触发器之外,您还可以查看SQL Server Enterprise Edition中提供的启用Change Data Capture。它可能是一个过冲,但应该提到它,你可能会发现它对其他表和对象很有用。

答案 3 :(得分:0)

Before Delete事件的触发器可以帮助您保护此表:

CREATE TRIGGER backup_row_before_delete ON COMPUTERS_Table FOR Delete
as 
    INSERT INTO Computers_Backup
    SELECT deleted.* from deleted 

如果您只想保留某些列,则可以更改deleted.*的{​​{1}}。

答案 4 :(得分:0)

  

将删除一行或多行,但不应该删除

然后你有权限和诚信问题。

您当然可以使用触发器来记录删除(当然还有更新),但我不建议您纯粹使用它来保留您不想删除的内容的副本!

如果必须,可以删除删除权限,如果可以,还可以增强数据完整性。如果没有您的架构,很难确切地知道如何。

最后,使用你的(INSTEAD OF)触发器来检查在适当时阻止删除所需的任何条件。