Внесение изменений в схемы баз данных публикации

Область применения: SQL Server Управляемый экземпляр SQL Azure

Репликация поддерживает широкий диапазон изменений схем для опубликованных объектов. При внесении любого из следующих изменений схемы на соответствующий опубликованный объект на издателе Microsoft SQL Server это изменение распространяется по умолчанию ко всем подписчикам SQL Server:

  • ALTER TABLE

  • ALTER TABLE SET LOCK ESCALATION не следует использовать, если включена репликация изменений схемы, а топология включает в себя SQL Server 2005 (9.x) или подписчиков SQL Server Compact 3.5.

  • ALTER VIEW

  • ALTER PROCEDURE

  • ALTER FUNCTION

  • ALTER TRIGGER

    Параметр ALTER TRIGGER можно использовать только для триггеров языка обработки данных DML, поскольку триггеры языка описания данных DDL не могут быть реплицированы.

Внимание

Изменения схемы в таблицах должны вноситься с помощью объектов Управления Transact-SQL или SQL Server (SMO). При внесении изменений схемы в SQL Server Management Studio среда Management Studio пытается удалить и повторно создать таблицу. Опубликованные объекты невозможно удалить, поэтому изменения схемы завершаются ошибкой.

При репликации транзакций и репликации слиянием изменения схемы распространяются в режиме последовательных добавлений при запусках агента распространителя или агента слияния. В случае репликации моментальных снимков изменения схемы распространяются при применении нового моментального снимка на подписчике. В репликации моментальных снимков при каждой синхронизации подписчику отправляется новая копия схемы. Поэтому все изменения схемы (не только перечисленные выше) в ранее опубликованных объектах автоматически распространяются при каждой синхронизации.

Дополнительные сведения о добавлении и удалении статей в существующих публикациях см. в этой статье.

Репликация изменений схемы

Перечисленные выше изменения схемы реплицируются по умолчанию. Сведения об отключении репликации изменений схемы см. в разделе Replicate Schema Changes.

Вопросы изменений схемы

При репликации изменений схемы учитывайте следующее.

Общие рекомендации

  • Изменения схемы подвергаются любым ограничениям, введенным Transact-SQL. Например, ALTER TABLE не позволяет изменять первичные ключевые столбцы.

  • Сопоставление типов данных выполняется только для исходного моментального снимка. Изменения схемы не сопоставляются с предыдущими версиями типов данных. Например, если инструкция ALTER TABLE ADD datetime2 column используется в SQL Server 2012 (11.x), тип данных не преобразуется в nvarchar для подписчиков SQL Server 2005 (9.x). В некоторых случаях изменения схемы блокируются на издателе.

  • Если в публикации разрешено распространение изменений схемы, то изменения схемы распространяются независимо от того, как установлен соответствующий параметр схемы для статьи в публикации. Например, если вы указываете не реплицировать ограничения внешних ключей для статьи таблицы, а затем выполняете команду ALTER TABLE, которая добавляет внешний ключ в таблицу на издателе, внешний ключ будет добавлен в таблицу на подписчике. Чтобы предотвратить это, отключите распространение изменений схемы перед выполнением команды ALTER TABLE.

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

  • Изменения, распространяемые на переиздающего подписчика, по умолчанию распространяются на его подписчиков.

  • Если изменение схемы ссылается на объекты или ограничения, существующие на издателе, но отсутствующие на подписчике, изменение схемы будет успешно выполнено на издателе, а на подписчике оно завершится ошибкой.

  • Любой объект на подписчике, на который имеются ссылки, при добавлении внешнего ключа должен иметь то же имя и того же владельца, что и соответствующий объект на издателе.

  • Явное добавление, удаление или изменение индексов не реплицируются, и любое изменение, включающее явный индекс, должно выполняться отдельно для каждого набора реплик. Поддерживается неявное создание индексов для ограничений (например, для ограничения первичного ключа).

  • Изменение или удаление столбцов идентификаторов, управляемых репликацией, не поддерживается. Дополнительные сведения об автоматическом управлении столбцами идентификаторов см. в статье Репликация столбцов идентификаторов.

  • Изменения схемы, включающие недетерминированные функции, не поддерживаются, поскольку они могут привести к разным данным на издателе и на подписчике (эта разница данных называется расхождением). Например, если на издателе выполнить команду ALTER TABLE SalesOrderDetail ADD OrderDate DATETIME DEFAULT GETDATE(), значения будут отличаться от случая, когда команда реплицируется на подписчик и выполняется. Дополнительные сведения о недетерминированных функциях см. в разделе Deterministic and Nondeterministic Functions.

  • Рекомендуется именовать ограничения явным образом. Если ограничение не имеет явного имени, SQL Server создает имя ограничения, и эти имена будут отличаться на издателе и каждом подписчике. Это может стать причиной проблем во время репликации изменений схемы. Например, если на издателе удаляется столбец и зависимое ограничение, то во время репликации будет произведена попытка удалить ограничение на подписчике. Эта попытка удаления на подписчике завершится ошибкой, так как имена ограничения на издателе и на подписчике различаются. Если синхронизация завершается сбоем из-за различия имен ограничения, то удалите ограничение на подписчике вручную, а затем перезапустите агент слияния.

  • При публикации какой-либо таблицы для репликации невозможно изменить данные столбца в этой таблице на данные типа XML, если моментальный снимок публикации уже создан. Перед изменением столбца необходимо вначале удалить репликацию.

  • Уровень изоляции «read uncommitted» не является поддерживаемым уровнем изоляции при выполнении DDL в опубликованной таблице.

  • АргументSET CONTEXT_INFO не следует использовать для изменения контекста транзакций, изменения схемы выполняются для опубликованных объектов.

Добавление столбцов

  • Чтобы добавить новый столбец в таблицу и включить этот столбец в существующую публикацию, выполните инструкцию ALTER TABLE <> TABLE ADD <Column>. По умолчанию этот столбец затем реплицируется на все подписчики. Столбец должен допускать использование значений NULL или содержать ограничение по умолчанию. Дополнительные сведения о добавлении столбцов см. в подразделе «Репликация слиянием» этого раздела.

  • Чтобы добавить новый столбец в таблицу и не включить этот столбец в существующую публикацию, отключите репликацию изменений схемы, а затем выполните инструкцию ALTER TABLE <> ADD <Column>.

  • Чтобы включить существующий столбец в существующую публикацию, используйте sp_articlecolumn (Transact-SQL), sp_mergearticlecolumn (Transact-SQL) или диалоговое окно "Свойства публикации — <публикация".>

    Дополнительные сведения см. в разделе Define and Modify a Column Filter. Это потребует повторной инициализации подписок.

  • Добавление столбца идентификаторов в опубликованную таблицу не поддерживается, поскольку это может привести к расхождению данных при репликации столбца на подписчик. Значения в столбце идентификаторов на издателе зависят от порядка, в котором строки изменяемой таблицы хранятся физически. Строки могут храниться по-разному на подписчике. Поэтому значение для столбца идентификаторов может быть разным для одинаковых строк.

Удаление столбцов

  • Чтобы удалить столбец из существующей публикации и удалить столбец из таблицы на издателе, выполните инструкцию ALTER TABLE <> DROP <Column>. По умолчанию столбец затем удаляется из таблицы на всех подписчиках.

  • Чтобы удалить столбец из существующей публикации, но сохранить столбец в таблице на издателе, используйте sp_articlecolumn (Transact-SQL), sp_mergearticlecolumn (Transact-SQL) или диалоговое окно "Свойства публикации — публикация". <>

    Дополнительные сведения см. в разделе Define and Modify a Column Filter. Это потребует создания нового моментального снимка.

  • Удаляемый столбец не может использоваться в предложениях фильтра любой статьи любой публикации в базе данных.

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

    • Нельзя удалить столбцы, используемые первичным ключом, из статей в публикациях транзакций, потому что они используются репликацией.

    • Нельзя удалить столбец rowguid из статей в публикациях слиянием или столбец mstran_repl_version из статей в публикациях транзакций, поддерживающих обновляемые подписки, поскольку они используются репликацией.

    • Изменения индекса не распространяются на подписчики: при удалении столбца на издателе и зависимого индекса репликация удаления индекса не производится. Чтобы выполнить удаление столбца при его реплицировании с издателя на подписчик, следует удалить индекс на подписчике перед удалением столбца на издателе. Если выполнить синхронизацию не удалось из-за какого-либо индекса на подписчике, то удалите этот индекс вручную, а затем перезапустите агент слияния.

    • Ограничения следует именовать явным образом для удаления. Дополнительные сведения см. в подразделе «Общие вопросы» этого раздела.

репликация транзакций

  • Изменения схемы распространяется на подписчиков, работающих с предыдущими версиями SQL Server, но инструкция DDL должна включать только синтаксис, поддерживаемый версией на подписчике.

    Если подписчик публикует данные повторно, поддерживаемые изменения схемы включают только добавление и удаление столбца. Эти изменения следует вносить на издателе с помощью sp_repladdcolumn (Transact-SQL) и sp_repldropcolumn (Transact-SQL), а не синтаксиса ALTER TABLE DDL.

  • Репликация изменений схемы не выполняется для подписчиков, отличных от подписчиков SQL Server.

  • Изменения схемы не распространяются от издателей, отличных от SQL Server.

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

  • Если публикация поддерживает подписки с немедленным обновлением или обновляемой посредством очередей подписки, перед выполнением изменений схемы следует заморозить систему: любые действия в опубликованной таблице должны быть прекращены на издателе и подписчиках, а отложенные изменения данных должны быть распространены на все узлы. После распространения изменений схемы на все узлы можно возобновить действия в опубликованных таблицах.

  • Если публикация находится в одноранговой топологии, перед выполнением изменений схемы система должна быть приостановлена. Дополнительные сведения см. в статье Заморозить топологию репликации (программирование репликации на языке Transact-SQL).

  • Добавление в таблицу столбца типа timestamp и сопоставление типа timestamp с типом binary(8) вызывает повторную инициализацию статьи для всех активных подписок.

Репликация слиянием

  • Способ обработки изменений схемы при репликации слиянием определяется уровнем совместимости публикации и режимом моментального снимка — собственным (по умолчанию) или символьным.

    • Для репликации изменений схемы уровень совместимости публикации должен быть не меньше 90RTM. Если подписчики выполняют предыдущие версии SQL Server или уровень совместимости меньше 90RTM, можно использовать sp_repladdcolumn (Transact-SQL) и sp_repldropcolumn (Transact-SQL) для добавления и удаления столбцов. Однако эти процедуры являются устаревшими.

    • Если вы попытаетесь добавить в существующую статью столбец с типом данных, представленным в SQL Server 2008 (10.0.x), SQL Server имеет следующее поведение:

      100RTM, собственный режим моментального снимка 100RTM, символьный режим моментального снимка Все другие уровни совместимости
      hierarchyid Разрешить изменения Блокировать изменения Блокировать изменения
      geography и geometry Разрешить изменения Разрешить изменения* Блокировать изменения
      файловый поток Разрешить изменения Блокировать изменения Блокировать изменения
      date, time, datetime2и datetimeoffset Разрешить изменения Разрешить изменения* Блокировать изменения

      * Подписчики SQL Server Compact преобразуют эти типы данных на подписчике.

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

  • Если изменение схемы выполняется в столбце, входящем в фильтр соединения или параметризованный фильтр, потребуется повторно инициализировать все подписки и заново создать моментальный снимок.

  • Репликация слиянием обеспечивает игнорирование хранимыми процедурами изменений схемы во время устранения неполадок. Дополнительные сведения см. в статьях sp_markpendingschemachange (Transact-SQL) и sp_enumeratependingschemachanges (Transact-SQL).