仅每天运行一次的触发器

时间:2012-12-03 08:36:21

标签: sql-server triggers sql-server-2012

此触发器将数据从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 个答案:

答案 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行需要处理 - 实际处理随后会在非高峰时段发生,而不会打扰系统用户。