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