Внесение изменений схем в базы данных публикаций
Репликация поддерживает широкий диапазон изменений схем для опубликованных объектов. Когда выполняется любое из следующих изменений схемы соответствующего опубликованного объекта на издателе Microsoft SQL Server, это изменение распространяется по умолчанию на все подписчики SQL Server:
ALTER TABLE
Не следует использовать параметр ALTER TABLE SET LOCK ESCALATION, если включена репликация изменения схемы и топология включает SQL Server 2005 или SQL Server Compact 3.5 Subscribers.ALTER VIEW
ALTER PROCEDURE
ALTER FUNCTION
ALTER TRIGGER
Параметр ALTER TRIGGER можно использовать только для триггеров языка обработки данных DML, поскольку триггеры языка описания данных DDL не могут быть реплицированы.
Важно! |
---|
Изменения схем таблиц должны выполняться с использованием Transact-SQL или объектов SMO SQL Server. Когда изменения схемы выполняются в среде Среда SQL Server Management Studio, среда Management Studio пытается удалить и затем повторно создать таблицу. Опубликованные объекты невозможно удалить, поэтому изменения схемы завершаются ошибкой. |
При репликации транзакций и репликации слиянием изменения схемы распространяются в режиме последовательных добавлений при запусках агента распространителя или агента слияния. В случае репликации моментальных снимков изменения схемы распространяются при применении нового моментального снимка на подписчике. В репликации моментальных снимков при каждой синхронизации подписчику отправляется новая копия схемы. Поэтому все изменения схемы (не только перечисленные выше) в ранее опубликованных объектах автоматически распространяются при каждой синхронизации.
Сведения о добавлении и удалении статей из публикаций см. в разделе Добавление и удаление статей в существующих публикациях.
Репликация изменений схемы
Перечисленные выше изменения схемы реплицируются по умолчанию. Сведения об отключении репликации изменений схемы см. в следующих разделах:
Среда SQL Server Management Studio: Как реплицировать изменения схемы (среда SQL Server Management Studio)
Программирование репликации на языке Transact-SQL: Как выполнить репликацию изменений схемы (программирование репликации на языке Transact-SQL)
Вопросы изменений схемы
При репликации изменений схемы учитывайте следующее.
Общие рекомендации
Изменения схемы подвержены любым ограничениям, накладываемым языком Transact-SQL. Например, ALTER TABLE не позволяет изменять столбцы первичных ключей.
Сопоставление типов данных выполняется только для исходного моментального снимка. Изменения схемы не сопоставляются с предыдущими версиями типов данных. Например, если инструкция ALTER TABLE ADD datetime2 column используется в SQL Server 2008, тип данных не преобразуется в nvarchar для подписчиков SQL Server 2005. В некоторых случаях изменения схемы блокируются на издателе.
Если в публикации разрешено распространение изменений схемы, то изменения схемы распространяются независимо от того, как установлен соответствующий параметр схемы для статьи в публикации. Например, если вы указываете не реплицировать ограничения внешних ключей для статьи таблицы, а затем выполняете команду ALTER TABLE, которая добавляет внешний ключ в таблицу на издателе, внешний ключ будет добавлен в таблицу на подписчике. Чтобы предотвратить это, отключите распространение изменений схемы перед выполнением команды ALTER TABLE.
Изменения схемы должны выполняться только на издателе, а не на подписчиках (включая переиздающих подписчиков). Репликация слиянием предотвращает изменения схемы на подписчиках. Репликация транзакций не предотвращает изменения, однако изменения могут быть причиной ошибки репликации.
Изменения, распространяемые на переиздающего подписчика, по умолчанию распространяются на его подписчиков.
Если изменение схемы ссылается на объекты или ограничения, существующие на издателе, но отсутствующие на подписчике, изменение схемы будет успешно выполнено на издателе, а на подписчике оно завершится ошибкой.
Любой объект на подписчике, на который имеются ссылки, при добавлении внешнего ключа должен иметь то же имя и того же владельца, что и соответствующий объект на издателе.
Явное добавление, удаление и изменение индексов не поддерживаются. Поддерживается неявное создание индексов для ограничений (например, для ограничения первичного ключа).
Изменение или удаление столбцов идентификаторов, управляемых репликацией, не поддерживается. Дополнительные сведения об автоматическом управлении столбцами идентификаторов см. в разделе Репликация столбцов идентификаторов.
Изменения схемы, включающие недетерминированные функции, не поддерживаются, поскольку они могут привести к разным данным на издателе и на подписчике (эта разница данных называется расхождением). Например, если выполнить следующую команду на издателе: ALTER TABLE SalesOrderDetail ADD OrderDate DATETIME DEFAULT GETDATE(), полученные значения будут отличаться от значений, получаемых при репликации команды на подписчик и последующем ее выполнении. Дополнительные сведения о недетерминированных функциях см. в разделе Детерминированные и недетерминированные функции.
Рекомендуется именовать ограничения явным образом. Если ограничение не именовано явным образом, то SQL Server создает для него имя. Эти имена будут отличаться для издателя и подписчика. Это может стать причиной проблем во время репликации изменений схемы. Например, если на издателе удаляется столбец и зависимое ограничение, то во время репликации будет произведена попытка удалить ограничение на подписчике. Эта попытка удаления на подписчике завершится ошибкой, так как имена ограничения на издателе и на подписчике различаются. Если синхронизация завершается сбоем из-за различия имен ограничения, то удалите ограничение на подписчике вручную, а затем перезапустите агент слияния.
При публикации какой-либо таблицы для репликации невозможно изменить данные столбца в этой таблице на данные типа XML, если моментальный снимок публикации уже создан. Перед изменением столбца необходимо вначале удалить репликацию. Дополнительные сведения см. в разделе Удаление репликации.
Уровень изоляции Read Uncommitted не поддерживается при выполнении DDL для опубликованной таблицы.
Добавление столбцов
Для добавления в таблицу нового столбца и включения этого столбца в существующую публикацию выполните ALTER TABLE <Table> ADD <Column>. По умолчанию этот столбец затем реплицируется на все подписчики. Столбец должен допускать использование значений NULL или содержать ограничение по умолчанию. Дополнительные сведения о добавлении столбцов см. в подразделе «Репликация слиянием» этого раздела.
Чтобы добавить в таблицу новый столбец и не включить этот столбец в существующую публикацию, отключите репликацию изменений схемы, а затем выполните ALTER TABLE <Table> ADD <Column>.
Чтобы включить существующий столбец в существующую публикацию, используйте процедуры sp_articlecolumn (Transact-SQL), sp_mergearticlecolumn (Transact-SQL) или диалоговое окно Свойства публикации — <Публикация>.
Дополнительные сведения см. в разделах Как определить и изменить фильтр столбцов (программирование репликации на языке Transact-SQL) и Как определить и изменить фильтр столбцов (среда SQL Server Management Studio). Это потребует повторной инициализации подписок.
Добавление столбца идентификаторов в опубликованную таблицу не поддерживается, поскольку это может приводить к расхождению данных при репликации столбца на подписчик. Значения в столбце идентификаторов на издателе зависят от порядка, в котором строки изменяемой таблицы хранятся физически. Строки могут храниться по-разному на подписчике. Поэтому значение для столбца идентификаторов может быть разным для одинаковых строк.
Удаление столбцов
Для удаления столбца из существующей публикации и удаления столбца из таблицы на издателе выполните ALTER TABLE <Table> DROP <Column>. По умолчанию столбец затем удаляется из таблицы на всех подписчиках.
Чтобы удалить столбец из существующей публикации, но сохранить его в таблице на издателе, используйте процедуры sp_articlecolumn (Transact-SQL), sp_mergearticlecolumn (Transact-SQL) или диалоговое окно Свойства публикации — <публикация>.
Дополнительные сведения см. в разделах Как определить и изменить фильтр столбцов (программирование репликации на языке Transact-SQL) и Как определить и изменить фильтр столбцов (среда 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.
Индексированные представления, которые реплицируются в виде таблиц, невозможно изменить. Индексированные представления, которые реплицируются как индексированные представления, могут быть изменены, однако их изменение приведет к тому, что они станут обычными, а не индексированными представлениями.
Если публикация поддерживает подписки с немедленным обновлением или обновлением по очереди, перед выполнением изменений схемы следует приостановить систему: любые действия в опубликованной таблице должны быть прекращены на издателе и подписчиках, а отложенные изменения данных должны быть распространены на все узлы. После распространения изменений схемы на все узлы можно возобновить действия в опубликованных таблицах.
В предыдущих версиях SQL Server до внесения изменений в схему было необходимо заморозить публикации в одноранговых топологиях. Начиная с SQL Server 2008, публикации больше не нужно замораживать, за исключением случаев, описанных в других частях этого раздела.
Добавление в таблицу столбца типа 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
Разрешить изменения
Разрешить изменения1
Блокировать изменения
filestream
Разрешить изменения
Блокировать изменения
Блокировать изменения
date, time, datetime2 и datetimeoffset
Разрешить изменения
Разрешить изменения1
Блокировать изменения
1 Подписчики SQL Server Compact преобразуют эти типы данных на подписчике.
Дополнительные сведения о совместимости публикаций см. в подразделе «Уровень совместимости для публикаций слиянием» раздела Использование нескольких версий SQL Server в топологии репликации.
Если при применении изменения схемы возникает ошибка (например, ошибка по причине добавления внешнего ключа, ссылающегося на таблицу, которая недоступна на подписчике), синхронизация завершается ошибкой, и подписка должна быть инициализирована повторно.
Если изменение схемы выполняется в столбце, входящем в фильтр объединения или параметризованный фильтр, потребуется повторно инициализировать все подписки и заново создать моментальный снимок.
Репликация слиянием обеспечивает игнорирование хранимыми процедурами изменений схемы во время устранения неполадок. Дополнительные сведения см. в разделах sp_markpendingschemachange (Transact-SQL) и sp_enumeratependingschemachanges (Transact-SQL).
См. также
Справочник
Основные понятия
Журнал изменений
Обновленное содержимое |
---|
Теперь появилась возможность репликации транзакций. Если необходимо изменить все схемы, одноранговые топологии замораживать не нужно. |