每天只运行一次的触发器

3

这个触发器将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

我希望备份变更,但每天只备份一个版本。如果没有变更,则不进行备份。

1个回答

4
那不再是一个触发器,而将成为一个定时任务。触发器根据其定义,在给定操作(INSERT、DELETE、UPDATE)发生时执行。使用SQL Server Agent工具每天运行一次T-SQL代码。在MSDN的SQL Server图书在线阅读了解有关SQL Server代理作业的所有内容。更新:如果我理解正确:您想拥有一个UPDATE触发器-但该触发器仅记录受影响的NodeID,进入“这些节点需要在晚上备份”的表中。然后,在晚上,您将运行一个SQL Agent作业,扫描那个“工作表”,对于存储在其中的所有NodeID值,它将执行该T-SQL语句以将它们的数据复制到NodeArchive表中。
使用这种方法,如果您的具有NodeID = 42的节点更改了十次,您仍将在工作表中只有一个条目NodeID = 42,然后夜间备份作业将只复制该节点一次到NodeArchive中。
使用这种方法,您可以将实际复制(可能需要时间)与更新过程分离。 UPDATE触发器仅记录哪些NodeID行需要处理-实际处理稍后在非高峰时段进行,而不会干扰系统用户。

当 dbo.Node 有更新时,应插入到 dbo.NodeArchive 中。如果 dbo.Node 中的特定行从未更改,则 dbo.NodeArchive 永远不会插入任何内容。 - James A Mohler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接