sql-server - 每天只运行一次的触发器

标签 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

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

最佳答案

这不再是触发器 - 这将是一个计划的工作。触发器根据其定义每当给定操作(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 行需要处理 - 实际处理随后会在非高峰时间发生,不会打扰系统用户。

关于sql-server - 每天只运行一次的触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13679646/

相关文章:

mysql - 触发,不插入

sql - 比较变量中的日期,检查它们是否按升序排列

sql-server - 如何在 VBA 中枚举 LAN 上的 SQL Server 实例?

sql-server - 我可以使用 T-SQL 启动记事本或其他 UI 应用程序吗?

c# - 如何使SQL表属性唯一(不可重复)

php - MYSQL : Getting error in TRIGGER

MySQL 触发器在后续查询中不识别 NEW.entity?

sql-server - SQL 递归 CTE - 保留对父级的引用

sql - 使用sql在现有整数子集中不存在的范围内查找下一个可用整数

sql-server - VCS 中具有迁移的数据库