将已删除的数据从表移动到另一个表的最佳方法是什么?假设两个表都有相同的列定义?
EmpTable
EmpID(PK, identity) EmpName(nvarchar(max)) Picture(varbinary(max))
DeletedEmpTable
DeletedEmpID(PK, identity) EmpID(int) EmpName(nvarchar(max)) Picture(varbinary(max))
答案 0 :(得分:2)
如果表没有参与外键,有触发器,有标识列,计算列等,你可以用the OUTPUT
clause做这样的事情:
DELETE dbo.Table1
OUTPUT deleted.*
INTO dbo.Table2
WHERE ...
您可以通过编写更具创意的OUTPUT
子句来解决其中一些限制,但不是全部。如果您有任何阻止使用OUTPUT
子句的限制,则可以使用INSTEAD OF
trigger执行这两项操作。
CREATE TRIGGER dbo.TriggerOnTable1
ON dbo.Table1
INSTEAD OF DELETE
AS
BEGIN
SET NOCOUNT ON;
INSERT dbo.Table2(cols) SELECT cols FROM deleted;
DELETE t FROM dbo.Table1 AS t
INNER JOIN deleted AS d
ON t.key_column = d.key_column;
END
GO
很多人质疑INSTEAD OF
触发器与常规触发器相比的价值。我喜欢他们的是,如果你有任何可能导致你取消删除的验证,你可以取消删除而不是让它发生然后再回滚。