Рекомендации и ограничения реестра
Область применения: SQL Server 2022 (16.x) База данных SQL Azure Управляемый экземпляр SQL Azure
Из-за характера системного управления версиями и неизменяемыми данными имеются некоторые рекомендации и ограничения, которые следует учитывать при работе с таблицами реестра.
Общие рекомендации и ограничения
При работе с реестром нужно принимать во внимание указанное ниже.
- База данных реестра является базой данных с включенным свойством реестра, которую невозможно преобразовать в обычную базу данных с выключенным свойством реестра.
- Автоматическое создание и использование хранилища хэшей базы данных сейчас доступно в Базе данных SQL Azure, но не поддерживается в SQL Server.
- Автоматическое управление хэшами с реестром с помощью неизменяемых больших двоичных объектов в службе хранилища Azure не дает пользователям возможности применять учетные записи локально избыточного хранилища (LRS).
- При создании базы данных реестра все новые таблицы, создаваемые в базе данных по умолчанию (без указания предложения
APPEND_ONLY = ON
), будут обновляемыми таблицами реестра. Чтобы создать таблицы реестра только для добавления, воспользуйтесь предложениемAPPEND_ONLY = ON
в операторах CREATE TABLE (Transact-SQL). - Транзакция способна обновлять до 200 таблиц реестра.
Рекомендации и ограничения для таблицы реестра
- Имеющиеся таблицы в базе данных, не поддерживающей реестр, невозможно преобразовать в таблицы реестра. Дополнительные сведения см. на странице Перенос данных из обычных таблиц в таблицы реестра.
- Созданная таблица реестра не может быть преобразована в таблицу, которая не является таблицей реестра.
- Удаление устаревших данных из таблиц реестра только для добавления или таблицы журнала обновляемых таблиц реестра не поддерживается.
TRUNCATE TABLE
не поддерживается.- При создании обновляемой таблицы реестра в нее добавляется четыре ВСЕГДА СОЗДАВАЕМЫХ столбца. В случае таблицы реестра только для добавления в нее добавляется два столбца. Эти новые столбцы создаются с учетом максимального поддерживаемого количества столбцов в Базе данных SQL Azure (1,024).
- Таблицы в памяти не поддерживаются.
- Наборы разреженных столбцов не поддерживаются.
- Секции SWITCH IN/OUT не поддерживаются.
- DBCC CLONEDATABASE не поддерживается.
- Таблицы реестра не могут иметь полнотекстовых индексов.
- Таблицы реестра не могут быть графовыми таблицами.
- В реестре не может быть таблиц FileTable.
- В таблицах реестра не может быть некластеризованного индекса rowstore, если в них есть кластеризованный индекс columnstore.
- Отслеживание изменений запрещено в таблице журнала, но разрешено в таблицах реестра.
- Запись измененных данных не разрешена в таблице журнала, но разрешена в таблицах реестра.
- Репликация транзакций не поддерживается для таблиц реестра.
- Зеркальное отображение базы данных не поддерживается.
- Azure Synapse Link поддерживается, но только для таблицы реестра, а не для таблицы журнала.
- Измените путь дайджеста вручную после собственного восстановления резервной копии базы данных на Управляемый экземпляр SQL Azure.
- Измените путь дайджеста вручную после создания ссылки Управляемый экземпляр на Управляемый экземпляр SQL Azure.
- Синхронизация данных SQL не поддерживается в таблицах реестра.
Неподдерживаемые типы данных
- XML
- SqlVariant
- Определяемый пользователем тип данных
- FILESTREAM
Ограничения темпоральной таблицы
Обновляемые таблицы реестра основаны на технологии темпоральных таблиц и наследуют большинство ограничений , но не все из них. Ниже указан список ограничений, унаследованных от темпоральных таблиц.
- Если при создании таблицы журнала указывается ее имя, следует указать имя схемы и таблицы, а также имя представления реестра.
- По умолчанию таблица журнала сжимается с использованием метода PAGE .
- Если текущая таблица секционирована, таблица журнала создается в файловой группе по умолчанию, так как конфигурация секционирования не реплицируется автоматически из текущей таблицы в таблицу журнала.
- Темпоральные таблицы и таблицы журнала не могут быть таблицами FILETABLE и могут содержать столбцы любого поддерживаемого типа данных, кроме FILESTREAM. FILETABLE и FILESTREAM позволяют управлять данными за пределами SQL Server, поэтому управление версиями системы не гарантируется.
- Таблицу узлов или граничную таблицу невозможно создать как темпоральную или преобразовать в нее. Graph не поддерживается в реестре.
- Хотя временные таблицы поддерживают типы данных больших двоичных объектов, такие как
(n)varchar(max)
,varbinary(max)
(n)text
иimage
, они будут нести значительные затраты на хранилище и иметь последствия для производительности из-за их размера. Таким образом, при проектировании системы следует использовать эти типы данных с осторожностью. - Таблицу журнала нужно создавать в той же базе данных, в которой создавалась текущая таблица. Темпоральные запросы Linked Server не поддерживаются.
- Таблица журнала не может иметь ограничений (ограничений первичного и внешнего ключа, а также таблицы или столбца).
- Параметр ONLINE (
WITH (ONLINE = ON
) не влияет наALTER TABLE ALTER COLUMN
при использовании темпоральной таблицы с системным управлением версиями.ALTER COLUMN
не выполняется в оперативном режиме независимо от того, какое значение указано для параметраONLINE
. - Операторы
INSERT
иUPDATE
не могут ссылаться на столбцы GENERATED ALWAYS. Попытки вставить значения непосредственно в эти столбцы будут блокироваться. UPDATETEXT
иWRITETEXT
не поддерживаются.- Триггеры в таблице журнала не допускаются.
- Использование технологий репликации ограничено:
- Всегда включено — полностью поддерживается.
- Моментальный снимок, слияние и репликация транзакций не поддерживаются для темпоральных таблиц
- Таблицу журнала невозможно настроить в качестве текущей в цепочке таблиц журнала.
- Следующие объекты или свойства не реплицируются из текущей таблицы в таблицу журнала при создании таблицы журнала:
- определение периода;
- определение идентификатора;
- Индексы
- Статистика
- Проверочные ограничения
- Триггеры
- конфигурация секционирования;
- Разрешения
- предикаты безопасности на уровне строк.
Рекомендации по изменениям схемы
Добавление столбцов
Поддерживается добавление столбцов, допускающих значение NULL. Добавление столбцов, не допускающих значение NULL, не поддерживается. Реестр предназначен для пропуска значений NULL при вычислении хэша версии строки. В зависимости от этого при добавлении столбца, допускающего значение NULL, реестр изменит схему таблицы реестра и журнала, включив новый столбец, но это не влияет на хэши имеющихся строк. Добавление столбцов в таблицы реестра захватывается в sys.ledger_column_history.
Удаление столбцов и таблиц
Как правило, при удалении столбца или таблицы полностью удаляются базовые данные, что принципиально несовместимо с функциями реестра, требующими неизменяемости данных. Вместо удаления данных реестр просто переименовывает удаляемые объекты, чтобы логически удалить их из пользовательской схемы, но оставить физические экземпляры в базе данных. Все удаленные столбцы также скрыты из схемы таблицы реестра, поэтому они невидимы для пользовательского приложения. Однако данные таких удаленных объектов остаются доступными для процесса проверки реестра и позволяют пользователям проверять любые исторические данные с помощью соответствующих представлений реестра. Удаление столбцов в таблице реестра захватывается в sys.ledger_column_history. Удаление таблицы реестра захватывается в sys.ledger_table_history. Удаленные таблицы реестра и зависимых объектов помечаются в представлениях системного каталога и переименовываются:
- Удаленные таблицы реестра помечаются путем установки
is_dropped_ledger_table
в sys.tables и переименовываются в следующем формате:MSSQL_DroppedLedgerTable_<dropped_ledger_table_name>_<GUID>
. - Удаленные таблицы журнала для обновляемых таблиц реестра переименовываются в следующем формате:
MSSQL_DroppedLedgerHistory_<dropped_history_table_name>_<GUID>
. - Удаленные представления реестра помечаются путем установки
is_dropped_ledger_view
в sys.views и переименовываются в следующем формате:MSSQL_DroppedLedgerView_<dropped_ledger_view_name>_<GUID>
.
Примечание.
Имя удаленных таблиц реестра, таблиц журнала и представлений реестра может быть усечено, если длина переименованной таблицы или представления превышает 128 символов.
Изменение столбцов
Любые изменения, которые не влияют на базовые данные таблицы реестра, поддерживаются без специальной обработки, так как они не влияют на хэши, захватываемые в реестре. К этим изменениям относятся следующие.
- изменение допустимости значений NULL;
- параметры сортировки для строк Юникода;
- длину столбцов переменной длины.
Однако любые операции, которые могут повлиять на формат имеющихся данных, например изменение типа данных, не поддерживаются.