2011-09-15 15 views
2

datetime列をサーバー時刻からUTC時刻に変換するスクリプトを作成しています。私はこれを行う関数を持っていますが、マイグレーションスクリプトは次の制約を伴う大きなプロセスの一部として実行されます:データベース移行 - 複数回実行できるUTC変換スクリプト

  1. スクリプトは複数回実行できなければなりません

    SET XACT_ABORT ON; 
    
    BEGIN TRANSACTION; 
    
    UPDATE SOME_TABLE 
    SET LastModified = [dbo].[f_ServerToUTC](LastModified) 
    
    COMMIT TRANSACTION; 
    

    ミリ秒単位ではないので:2回)

  2. これは、これまでのスクリプトで、移行後の周りの

を一時テーブルまたは他のデータを残すことはできません私のシナリオでは重要なことですが、ミリ秒の部分を特定の値に設定して、マイグレーションが既に実行されていることを示しました。しかし、私は、変換されていないデータでこの値に遭遇する確率が高すぎる(十分に与えられている)ように感じます。

私の制約を受けて、スクリプトが実行されたことを示すことができる他の方法はありますか?

答えて

2

私たちがこれを解決する方法は、私たちのシステムにある程度特有ですが、他の人にとっては役に立つかもしれません。私たちが代わりにサーバー時間の、それは同様のデータ型を変更することは意味をなさUTCする列を更新しているので

CREATE TYPE [dbo].[UtcDateTime] FROM [datetime] NOT NULL 

:私たちは、のように定義ユーザー定義型、UtcDateTimeを、持っています。したがって、変換を複数回実行しないように、データ型がすでに列で変更されているかどうかを確認することができます。

IF NOT EXISTS(
    SELECT 1 
    FROM sys.tables t 
    INNER JOIN sys.columns c 
     ON t.object_id = c.object_id 
    INNER JOIN sys.types ty 
     ON c.user_type_id = ty.user_type_id 
    WHERE t.object_id = object_id('SOME_TABLE') 
     AND c.name = 'LastModified' 
     AND ty.name = 'utcdatetime' 
) 
BEGIN 

    SET XACT_ABORT ON; 

    BEGIN TRANSACTION; 

    ALTER TABLE SOME_TABLE 
     ALTER COLUMN [LastModified] UTCDATETIME 

    UPDATE SOME_TABLE 
    SET LastModified = [dbo].[f_ServerToUTC](LastModified) 

    COMMIT TRANSACTION; 

END 
+0

ここで賢明に使用する:) 1つのUPDATEで列のすべてのデータを更新する場合、スクリプトを再実行可能にする必要があるのはなぜですか?あなたの配備プロセス/ツールには違いはありますか? –

+0

@Danere - はい、配備プロセスのためです。スクリプトを再実行可能にすると、デプロイの複雑さが大幅に軽減されます。これは例外的なケースで、通常は単純な "if exists、drop X"です。 –

関連する問題