3

このトリガーは、dbo.node から dbo.nodearchive にデータをバックアップします。バックアップは重要ですが、これを行う必要があるのは 1 日に 1 回だけです。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

変更のバックアップを検討していますが、1 日に複数のバックアップ バージョンを使用することはありません。変更がない場合、バックアップはありません。

4

1 に答える 1

4

それはもはやトリガーではありません - それはスケジュールされた仕事になります。トリガーは、定義上、特定の操作 ( ) が発生するたびに実行されます。INSERT, DELETE, UPDATE

SQL Server エージェント機能を使用して、その T-SQL コードを 1 日 1 回実行するようにスケジュールします。

MSDN の SQL Server Books Online で、SQL Server エージェント ジョブに関するすべての情報を参照してください。

更新:私が正しく理解している場合:UPDATEトリガーが必要ですが、そのトリガーは、NodeID影響を受けたもののみを「これらのノードは夜間にバックアップする必要がある」という種類のテーブルに記録します。次に、夜間に実行され、その「作業テーブル」をスキャンする SQL エージェント ジョブがNodeIDあり、そこに格納されているすべての値に対して、その T-SQL ステートメントを実行してデータをNodeArchiveテーブルにコピーします。

このアプローチでは、ノードNodeID = 42が 10 回変更された場合でも、作業テーブルには 1 つのエントリしかないためNodeID = 42、夜間のバックアップ ジョブはそのノードをNodeArchive.

このアプローチを使用すると、実際のコピー (時間がかかる場合があります) を更新プロセスから切り離すことができます。UPDATEトリガーは、処理が必要な行のみを記録します。NodeID実際の処理は、システムのユーザーを邪魔することなく、しばらくしてオフピーク時に行われます。

于 2012-12-03T08:39:38.950 に答える