此触发器将数据从dbo.node备份到dbo.nodearchive。虽然备份很重要,但我每天只需要执行一次。请注意,有一个名为dbo.NodeArchive.versionDate(smalldDatetime)的字段。
CREATE TRIGGER [dbo].[Node_update]
ON [dbo].[Node]
for UPDATE
AS
BEGIN
INSERT INTO dbo.NodeArchive ([NodeID]
,[ParentNodeID]
,[Slug]
,[xmlTitle]
...
,[ModifyBy]
,[ModifyDate]
,[CreateBy]
,[CreateDate])
SELECT [deleted].[NodeID]
,[deleted].[ParentNodeID]
,[deleted].[Slug]
,[deleted].[xmlTitle]
...
,[deleted].[ModifyBy]
,[deleted].[ModifyDate]
,[deleted].[CreateBy]
,[deleted].[CreateDate]
FROM [deleted] LEFT JOIN dbo.Node
ON [deleted].NodeID = dbo.Node.NodeID
WHERE deleted.ModifyDate <> dbo.Node.ModifyDate
END
GO
我希望备份更改,但每天不要超过一个备份版本。如果没有变化,则没有备份。
答案 0 :(得分:2)
这不再是触发器 - 这将是预定作业。按照其定义进行触发,只要发生给定操作(INSERT, DELETE, UPDATE
),就会执行。
使用SQL Server代理工具来安排每天运行一次T-SQL代码。
阅读all about SQL Server Agent Jobs in the SQL Server Books Online on MSDN
更新:如果我理解正确:您希望有一个UPDATE
触发器 - 但该触发器只会将受影响的NodeID
记录到“这些”节点需要在晚上备份“排序表。然后,在晚上,您将拥有一个运行的SQL代理作业,并扫描该“工作表”以及存储在其中的所有NodeID
值,然后它将执行该T-SQL语句以将其数据复制到NodeArchive
表。
使用这种方法,如果NodeID = 42
的节点更改十次,您的工作表中仍然只有一个条目NodeID = 42
,然后夜间备份作业将仅复制该节点一旦进入NodeArchive
。
使用此方法,您可以从更新过程中解除实际复制(可能需要一些时间)。 UPDATE
触发器仅记录哪些NodeID
行需要处理 - 实际处理随后会在非高峰时段发生,而不会打扰系统用户。