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

Применимо к: да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 или объектов SMO SQL Server . Когда изменения схемы выполняются в среде 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 <Table> ADD <Column>.

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

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

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

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

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

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

    Дополнительные сведения см. в разделе 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, то SQL Server будет вести себя следующим образом.

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

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

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

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

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

См. также:

ALTER TABLE (Transact-SQL)
ALTER VIEW (Transact-SQL)
ALTER PROCEDURE (Transact-SQL)
ALTER FUNCTION (Transact-SQL)
ALTER TRIGGER (Transact-SQL)
Публикация данных и объектов базы данных
Regenerate Custom Transactional Procedures to Reflect Schema Changes (Повторное создание пользовательских процедур транзакций для отражения изменений схем)