Перенос базы данных - скрипт преобразования UTC, который можно запустить несколько раз - PullRequest
2 голосов
/ 15 сентября 2011

Я пишу скрипт, который преобразует столбец datetime из времени сервера в время UTC.У меня есть функция, которая делает это, однако скрипт миграции будет запускаться как часть более крупного процесса со следующими ограничениями:

  1. Скрипт должен быть в состоянии запускаться несколько раз (т.е. непреобразовать столбец дважды)
  2. Не удается оставить временные таблицы или другие данные после переноса

Пока это сценарий:

SET XACT_ABORT ON;

BEGIN TRANSACTION;

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

COMMIT TRANSACTION;

Так какмиллисекунды не важны в моем сценарии, я рассмотрел установку миллисекундной части на какое-то конкретное значение, указывающее, что миграция уже выполнена.Тем не менее, я чувствую, что вероятность встретить это значение в неконвертированных данных слишком высока (учитывая достаточно).

Есть ли какой-то другой способ показать, что скрипт был запущен, учитывая мои ограничения?

1 Ответ

2 голосов
/ 16 сентября 2011

То, как мы решили эту проблему, является чем-то особенным для нашей системы, но может быть полезным для других.У нас есть пользовательский тип, UtcDateTime, определенный как:

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

Поскольку мы обновляем столбец как UTC, а не время сервера, также имеет смысл изменить тип данных.Таким образом, мы можем проверить, не был ли тип данных уже изменен в столбце, чтобы избежать многократного выполнения преобразования.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...