Как изменить точность datetime2 для таблицы с системной версией (временной таблицы) в SQL Server?

У меня есть 62 таблицы, которые были настроены как системные/временные таблицы, за исключением того, что столбцы времени начала и окончания были настроены как datetime2(0), как показано ниже.

SysStartTime [datetime2](0) GENERATED ALWAYS AS ROW START NOT NULL,
SysEndTime [datetime2](0) GENERATED ALWAYS AS ROW END NOT NULL,

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

ALTER TABLE SystemVersionedTable 
    SET (SYSTEM_VERSIONING = OFF);

ALTER TABLE SystemVersionedTable 
    ALTER COLUMN SysStartTime DATETIME2(7);

ALTER TABLE SystemVersionedTable 
    ALTER COLUMN SysEndTime DATETIME2(7);

ALTER TABLE SystemVersionedTable 
    SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = History.dbo_SystemVersionedTable));

Тем не менее, я все еще получаю следующую ошибку:

Столбец периода «SysStartTime» в темпоральной таблице с системным управлением версиями не может быть изменен.

Есть ли способ изменить эти два столбца и установить для них значение datetime2(7)?


person bm11    schedule 11.11.2020    source источник
comment
Вам нужно будет создать новую таблицу   -  person Alex    schedule 11.11.2020


Ответы (1)


Приведенный ниже скрипт работал у меня (конечно, вам нужно заменить {tableSchema}, {tableName}, {historyTableSchema}, {historyTableName} своими значениями).

Сценарий устанавливает новую точность 7 для SysStartTime и SysEndTime.

Обратите внимание, что столбец SysEndTime должен иметь максимальное значение DATETIME2 для заданной точности (отсюда и UPDATE).

Также обратите внимание, что индекс ix_{historyTableName}, который создается по умолчанию при определении темпоральных таблиц, необходимо удалить и создать заново.

См. для справки: https://docs.microsoft.com/en-us/sql/relational-databases/tables/creating-a-system-versioned-temporal-table?view=sql-server-ver15#migrate-existing-tables-to-built-in-support

BEGIN TRANSACTION

    ALTER TABLE [{tableSchema}].[{tableName}] SET (SYSTEM_VERSIONING = OFF)
    ALTER TABLE [{tableSchema}].[{tableName}] DROP PERIOD FOR SYSTEM_TIME
    DROP INDEX [ix_{historyTableName}] ON [{historyTableSchema}].[{historyTableName}]
    GO

    ALTER TABLE [{tableSchema}].[{tableName}]               ALTER COLUMN SysStartTime DATETIME2(7) NOT NULL
    ALTER TABLE [{tableSchema}].[{tableName}]               ALTER COLUMN SysEndTime   DATETIME2(7) NOT NULL
    ALTER TABLE [{historyTableSchema}].[{historyTableName}] ALTER COLUMN SysStartTime DATETIME2(7) NOT NULL
    ALTER TABLE [{historyTableSchema}].[{historyTableName}] ALTER COLUMN SysEndTime   DATETIME2(7) NOT NULL
    CREATE CLUSTERED INDEX [ix_{historyTableName}] ON [{historyTableSchema}].[{historyTableName}] (SysEndTime, SysStartTime)
    GO

    UPDATE [{tableSchema}].[{tableName}] SET SysEndTime = CONVERT(DATETIME2(7), '9999-12-31 23:59:59.9999999')
    GO

    ALTER TABLE [{tableSchema}].[{tableName}] ADD PERIOD FOR SYSTEM_TIME (SysStartTime, SysEndTime)
    ALTER TABLE [{tableSchema}].[{tableName}] SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = [{historyTableSchema}].[{historyTableName}], DATA_CONSISTENCY_CHECK = ON))
    GO

COMMIT TRANSACTION
person DD974    schedule 29.03.2021