这对于SQL专家来说可能很容易,但SQL(虽然我可以使用它)并不是我的事。
我在DB中有一张桌子。 (我们称之为计算机)
大约10.000行。 25列。 1个唯一键:列资产。
有时外部程序会删除一行或多行,但不应该这样做,因为我们仍然需要知道这些行中的一些信息才能真正删除这些项。
我们无法控制外部应用程序的行为,因此我们想出了一个不同的想法:
我们要创建第二个相同的表格(COMPUTERS_BACKUP),并最初使用计算机的一对一副本填写此表。
之后,每天一次将新记录从COMPUTERS复制到COMPUTERS_BACKUP并更新COMPUTERS_BACKUP中的那些记录,其中COMPUTERS中的原始记录已更改(ASSETS列永远不会更改)。
这样我们就可以从计算机中删除记录的最后一个状态。
有人可以提供可以安排每天运行一次的存储过程的代码吗?我可以自己解决这个问题,但这需要几个小时左右的时间,而且时间紧迫。
答案 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)触发器来检查在适当时阻止删除所需的任何条件。