2012-12-03 191 views
2

該觸發器將數據從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 

我正在尋找備份更改,但每天不會超過一個備份版本。如果沒有變化,就沒有備份。

回答

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行需要處理 - 實際處理過程稍後會在非高峯時段進行,而不會干擾系統的用戶。

+0

當更新到dbo.Node時,它應該插入到dbo.NodeArchive中。如果dbo.Node中的某一行永遠不會更改,則dbo.NodeArchive永遠不會插入任何內容。 –