1

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

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

有时外部程序会删除 1 行或更多行,但不应该这样做,因为我们仍然需要从这些行中了解一些信息,然后才能真正删除这些项目。

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

我们想创建第二个相同的表 (COMPUTERS_BACKUP),并最初用 COMPUTERS 的一对一副本填充它。
之后,每天一次将新记录从 COMPUTERS 复制到 COMPUTERS_BACKUP 并更新 COMPUTERS_BACKUP 中原来 COMPUTERS 中已更改的那些记录(ASSETS 列永远不会更改)。

这样我们就可以保留从 COMPUTERS 中删除的记录的最后状态。

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

4

5 回答 5

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
于 2013-06-12T10:48:43.940 回答
1

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

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

它将防止删除记录。

这是SQLFiddle演示。

于 2013-06-12T11:01:57.220 回答
1

除了创建触发器之外,您还可以考虑启用SQL Server Enterprise Edition 中提供的Change Data Capture 。这可能有点过头了,但应该提到它,您可能会发现它对其他表格和对象很有用。

于 2013-06-12T11:08:43.233 回答
0

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

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

如果您只想保留某些列,您可以更改deleted.*deleted.col1, deleted.col2

于 2013-06-12T10:44:18.553 回答
0

将删除 1 行或更多行,但不应该这样做

然后你有权限和完整性问题。

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

如果必须,请删除删除权限,或者如果可以,请加强数据完整性。如果没有您的架构,很难确切地说出如何。

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

于 2013-06-12T11:17:31.287 回答