【问题标题】:Trigger that only runs runs once per day每天只运行一次的触发器
【发布时间】:2012-12-03 08:36:20
【问题描述】:

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

我希望备份更改,但每天最多备份一个版本。如果没有变化,就没有备份。

【问题讨论】:

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


    【解决方案1】:

    这不再是一个触发器 - 这将是一个预定的工作。触发器根据他们的定义执行每当给定操作(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 语句以将其数据复制到 @987654326 @表。

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

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

    【讨论】:

    • 当 dbo.Node 有更新时,它应该插入到 dbo.NodeArchive。如果 dbo.Node 中的特定行从未更改,则 dbo.NodeArchive 永远不会插入任何内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2012-02-14
    • 2014-02-14
    • 1970-01-01
    • 2023-04-08
    相关资源
    最近更新 更多