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

Изменения: 14 апреля 2006 г.

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

  • ALTER TABLE
  • ALTER VIEW
  • ALTER PROCEDURE
  • ALTER FUNCTION
  • ALTER TRIGGER (ALTER TRIGGER может использоваться только для триггеров языка манипулирования данными [DML], поскольку триггеры языка определения данных [DDL] не могут быть реплицированы.)
ms151870.note(ru-ru,SQL.90).gifВажно!
Изменения схемы таблиц должны выполняться с использованием Transact-SQL или SQL Server Management Objects (SMO). Когда изменения схемы выполняются в среде SQL Server Management Studio, среда Management Studio пытается удалить и затем повторно создать таблицу. Опубликованные объекты невозможно удалить, поэтому изменения схемы завершаются ошибкой.

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

Сведения о добавлении и удалении статей из публикаций см. в разделе Добавление и удаление статей в существующих публикациях.

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

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

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

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

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

  • Изменения схемы подвержены любым ограничениям, накладываемым языком Transact-SQL. Например, ALTER TABLE не позволяет изменять столбцы первичных ключей.
  • Если в публикации разрешено распространение изменений схемы, то изменения схемы распространяются независимо от того, как установлен соответствующий параметр схемы для статьи в публикации. Например, если вы указываете не реплицировать ограничения внешних ключей для табличной статьи, а затем выполняете команду ALTER TABLE, которая добавляет внешний ключ в таблицу на издателе, внешний ключ будет добавлен в таблицу на подписчике. Чтобы предотвратить это, отключите распространение изменений схемы перед выполнением команды ALTER TABLE.
  • Изменения схемы должны выполняться только на издателе, а не на подписчиках (включая переиздающих подписчиков). Репликация слиянием предотвращает изменения схемы на подписчиках. Репликация транзакций не предотвращает изменения, однако изменения могут быть причиной ошибки репликации.
  • Изменения, распространяемые на переиздающего подписчика, по умолчанию распространяются на его подписчиков.
  • Если изменение схемы ссылается на объекты или ограничения, существующие на издателе, но отсутствующие на подписчике, изменение схемы будет успешно выполнено на издателе, а на подписчике оно завершится ошибкой.
  • Любой объект на подписчике, на который имеются ссылки, при добавлении внешнего ключа должен иметь то же имя и того же владельца, что и соответствующий объект на издателе.
  • Явное добавление, удаление и изменение индексов не поддерживаются. Поддерживается неявное создание индексов для ограничений (например, для ограничения первичного ключа).
  • Изменение или удаление столбцов идентификаторов, управляемых репликацией, не поддерживается. Дополнительные сведения об автоматическом управлении столбцами идентификаторов см. в разделе Репликация столбцов идентификаторов.
  • Изменения схемы, включающие недетерминированные функции, не поддерживаются, поскольку они могут привести к разным данным на издателе и на подписчике (эта разница данных называется расхождением). Например, если выполнить следующую команду на издателе: ALTER TABLE SalesOrderDetail ADD OrderDate DATETIME DEFAULT GETDATE(), полученные значения будут отличаться от значений, получаемых при репликации команды на подписчик и последующем ее выполнении. Дополнительные сведения о недетерминированных функциях см. в разделе Детерминированные и недетерминированные функции.
  • Рекомендуется именовать ограничения явным образом. Если ограничение не именовано явным образом, то SQL Server создает для него имя. Эти имена будут отличаться для издателя и подписчика. Это может стать причиной проблем во время репликации изменений схемы. Например, если на издателе удаляется столбец и зависимое ограничение, то во время репликации будет произведена попытка удалить ограничение на подписчике. Эта попытка удаления на подписчике завершится ошибкой, так как имена ограничения на издателе и на подписчике различаются. Если синхронизация завершается сбоем из-за различия имен ограничения, то удалите ограничение на подписчике вручную, а затем перезапустите агент слияния.
  • При публикации какой-либо таблицы для репликации изменить данные столбца в этой таблице на данные типа XML невозможно, если моментальный снимок публикации уже создан (можно произвести изменение данных столбца перед созданием моментального снимка). Перед изменением столбца необходимо вначале удалить репликацию. Дополнительные сведения см. в разделе Удаление репликации.

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

  • Для добавления в таблицу нового столбца и включения этого столбца в существующую публикацию выполните ALTER TABLE <Table> ADD <Column>. По умолчанию этот столбец затем реплицируется на все подписчики. Столбец должен допускать использование значений NULL или содержать ограничение по умолчанию.
  • Чтобы добавить в таблицу новый столбец и не включить этот столбец в существующую публикацию, отключите репликацию изменений схемы, а затем выполните ALTER TABLE <Table> ADD <Column>.
  • Чтобы включить существующий столбец в существующую публикацию, используйте процедуры sp_articlecolumn (Transact-SQL), sp_mergearticlecolumn (Transact-SQL) или диалоговое окно Свойства публикации — <Публикация>.
    Дополнительные сведения см. в разделах How to: Define and Modify a Column Filter (Replication Transact-SQL Programming) и Как определить и изменить фильтр столбцов (среда SQL Server Management Studio). Это потребует повторной инициализации подписок.
  • Добавление столбца идентификаторов в опубликованную таблицу не поддерживается, поскольку это может приводить к расхождению данных при репликации столбца на подписчик. Значения в столбце идентификаторов на издателе зависят от порядка, в котором строки изменяемой таблицы хранятся физически. Строки могут храниться по-разному на подписчике. Поэтому значение для столбца идентификаторов может быть разным для одинаковых строк.

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

  • Для удаления столбца из существующей публикации и удаления столбца из таблицы на издателе выполните ALTER TABLE <Table> DROP <Column>. По умолчанию столбец затем удаляется из таблицы на всех подписчиках.
  • Чтобы удалить столбец из существующей публикации, но сохранить его в таблице на издателе, используйте процедуры sp_articlecolumn (Transact-SQL), sp_mergearticlecolumn (Transact-SQL) или диалоговое окно Свойства публикации — <публикация>.
    Дополнительные сведения см. в разделах How to: Define and Modify a Column Filter (Replication Transact-SQL Programming) и Как определить и изменить фильтр столбцов (среда SQL Server Management Studio). Это потребует создания нового моментального снимка.
  • Удаляемый столбец не может использоваться в предложениях фильтра любой статьи любой публикации в базе данных.
  • При удалении столбца из опубликованной статьи имейте в виду возможное влияние на базу данных ограничений, индексов и свойств столбца. Например:
    • Нельзя удалить столбцы, используемые первичным ключом, из статей в публикациях транзакций, потому что они используются репликацией.
    • Нельзя удалить столбец rowguid из статей в репликациях слиянием или столбец mstran_repl_version из статей в публикациях транзакций, поддерживающих обновляемые подписки, поскольку они используются репликацией.
    • Изменения индекса не распространяются на подписчики: при удалении столбца на издателе и зависимого индекса репликация удаления индекса не производится. Чтобы выполнить удаление столбца при его реплицировании с издателя на подписчик, следует удалить индекс на подписчике перед удалением столбца на издателе. Если выполнить синхронизацию не удалось из-за какого-либо индекса на подписчике, то удалите этот индекс вручную, а затем перезапустите агент слияния.
    • Ограничения следует именовать явным образом для удаления. Дополнительные сведения см. в подразделе «Общие вопросы» этого раздела.

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

  • Изменения схемы распространяются на подписчики, использующие предыдущие версии SQL Server, однако инструкция DDL должна содержать только тот синтаксис, который поддерживается версией подписчика.
    Если подписчик публикует данные повторно, поддерживаемые изменения схемы включают только добавление и удаление столбца. Эти изменения должны быть выполнены на издателе с использованием sp_repladdcolumn (Transact-SQL) и sp_repldropcolumn (Transact-SQL) вместо применения DDL-синтаксиса ALTER TABLE.
  • Изменения схемы, распространяемые на подписчиков, не относящихся к SQL Server, вызывают повторную инициализацию подписчиков.
  • Изменения схемы не распространяются на издатели, не относящиеся к SQL Server.
  • Индексированные представления, которые реплицируются в виде таблиц, невозможно изменить. Индексированные представления, которые реплицируются как индексированные представления, могут быть изменены, однако их изменение приведет к тому, что они станут обычными, а не индексированными представлениями.
  • Если публикация поддерживает подписки с немедленным обновлением или обновлением по очереди, перед выполнением изменений схемы следует приостановить систему: любые действия в опубликованной таблице должны быть прекращены на издателе и подписчиках, а отложенные изменения данных должны быть распространены на все узлы. После распространения изменений схемы на все узлы можно возобновить действия в опубликованных таблицах.
  • Если публикация находится в одноранговой топологии, перед выполнением изменений схемы система должна быть приостановлена. Дополнительные сведения см. в разделе How to: Quiesce a Replication Topology (Replication Transact-SQL Programming).
  • Добавление в таблицу столбца timestamp и сопоставление типа timestamp с типом binary(8) вызывает повторную инициализацию статьи для всех активных подписок.

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

  • Для репликации изменений схемы уровень совместимости публикации должен быть не меньше 90RTM. Дополнительные сведения см. в подразделе «Уровень совместимости для публикаций слиянием» раздела Использование нескольких версий SQL Server в топологии репликации. Если на подписчиках выполняются предыдущие версии SQL Server или уровень совместимости менее 90RTM, для удаления и добавления столбцов по-прежнему можно использовать sp_repladdcolumn (Transact-SQL) и sp_repldropcolumn (Transact-SQL).
  • Если при применении изменения схемы возникает ошибка (например, ошибка по причине добавления внешнего ключа, ссылающегося на таблицу, которая недоступна на подписчике), синхронизация завершается ошибкой, и подписка должна быть инициализирована повторно.
  • Если изменение схемы выполняется в столбце, входящем в фильтр объединения или параметризованный фильтр, потребуется повторно инициализировать все подписки и заново создать моментальный снимок.
  • Репликация слиянием обеспечивает игнорирование хранимыми процедурами изменений схемы во время устранения неполадок. Дополнительные сведения см. в разделах 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)

Справка и поддержка

Получение помощи по SQL Server 2005

Журнал изменений

Версия Журнал

14 апреля 2006 г.

Новое содержимое
  • Добавлены сведения об изменении реплицированных таблиц для добавления XML-столбца.
  • Добавлены сведения об именовании ограничений.
  • Добавлены сведения об удалении зависимых индексов.
Измененное содержимое:
  • Удалено документированное требование на остановку синхронизации перед проведением изменений схемы в базе данных публикации слиянием.