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

我正在寻找备份更改,但每天不超过一个备份版本。如果没有变化,就没有备份。

4

1 回答 1

4

这不再是一个触发器——这将是一个预定的工作只要发生给定的操作( ),触发器就按照它们的定义执行INSERT, DELETE, UPDATE

使用 SQL Server 代理工具来安排该 T-SQL 代码每天运行一次。

阅读MSDN 上 SQL Server 联机丛书中有关 SQL Server 代理作业的所有内容

更新:所以如果我理解正确:你想要一个UPDATE触发器 - 但该触发器只会将NodeID受影响的触发器记录到“这些节点需要在晚上备份”之类的表中。然后,在晚上,您将有一个 SQL 代理作业运行并扫描该“工作表”并针对NodeID存储在其中的所有值,然后执行该 T-SQL 语句以将其数据复制到NodeArchive表中。

使用这种方法,如果您的节点NodeID = 42更改了十次,您的工作表中仍然只有一个条目NodeID = 42,然后夜间备份作业只会将该节点复制一次到NodeArchive.

使用这种方法,您可以将实际复制(可能需要时间)与更新过程分离。UPDATE触发器仅记录需要处理的NodeID行 - 然后实际处理会在稍后的某个时间,在非高峰时间发生,而不会干扰系统的用户。

于 2012-12-03T08:39:38.950 回答