Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Применимо к:SQL Server
Управляемый экземпляр SQL Azure
По умолчанию репликация транзакций вносит все изменения данных у подписчиков с помощью хранимых процедур, создаваемых с помощью внутренних процедур, для каждой таблицы в публикации. Три процедуры (одна для вставок, обновлений и удалений) копируются на подписчика и выполняются, когда вставка, обновление или удаление реплицируются на подписчика.
При изменении схемы в таблицу издателя SQL Server репликация автоматически создает эти процедуры, вызывая тот же набор внутренних процедур скриптов, чтобы новые процедуры соответствовали новой схеме (репликация изменений схемы не поддерживается для издателей Oracle).
Можно также указать пользовательские процедуры для замены одной или нескольких процедур по умолчанию. Настраиваемые процедуры следует изменить, если изменение схемы влияет на процедуру. Например если процедура ссылается на столбец, удаленный при изменении схемы, то ссылки на этот столбец должны быть удалены из пользовательской процедуры.
Имеется два способа, которыми репликация может передавать новую пользовательскую процедуру подписчикам:
- Используйте пользовательскую процедуру скриптов, чтобы заменить значения по умолчанию, используемые в репликации.
- Использование скрипта, содержащего новое определение пользовательской процедуры
Используйте пользовательскую процедуру скриптов, чтобы заменить значения по умолчанию, используемые в репликации.
При выполнении sp_addarticle убедитесь, что бит @schema_option установлен на 0x02true.
Замечание
Определение пользовательской хранимой процедуры должно скриптоваться с использованием динамического Transact-SQL в рамках обёрточной хранимой процедуры. Эта хранимая процедура-оболочка также должна содержать параметр @artid типа int, чтобы гарантировать его создание на стороне подписчика.
Выполните sp_register_custom_scripting и укажите значение insertupdate, или delete для параметра @type, а также имя пользовательской процедуры скрипта для параметра @value.
При следующем изменении схемы репликация вызывает эту хранимую процедуру, чтобы создать скрипт определения для новой пользовательской хранимой процедуры, а затем передает ее всем подписчикам.
Пример
В этом примере предположим, что издатель и подписчик уже настроены, и вы хотите создать настраиваемую delete хранимую процедуру.
На подписчике создайте таблицу для демонстрации пользовательского скрипта удаления.
USE [SubscriberDB]; GO CREATE TABLE DeleteLogging (id INT PRIMARY KEY); GOДобавьте статью от издателя. Обратите внимание на значения значений
@schema_option,@ins_cmd@upd_cmdи@del_cmdпараметров:USE [PublisherDB]; EXECUTE sp_addarticle @publication = N'PubName1', @article = N'Purchases', @source_owner = N'dbo', @source_object = N'Purchases', @type = N'logbased', @description = NULL, @creation_script = NULL, @pre_creation_cmd = N'drop', @schema_option = 0x000000000803509F, @identityrangemanagementoption = N'manual', @destination_table = N'Purchases', @destination_owner = N'dbo', @vertical_partition = N'false', @ins_cmd = N'CALL sp_MSins_dboPurchases', -- default @del_cmd = N'CALL custom_delete', -- custom @upd_cmd = N'SCALL sp_MSupd_dboPurchases'; -- default GOСоздайте хранимую процедуру, которая генерирует скрипт хранимой процедуры
custom_delete, которую вы хотите использовать на подписчике. Это хранимая процедура оболочки, как указано ранее.Возврат ненулевых значений из этой хранимой процедуры приводит к тому, что
custom_deleteне создается на подписчике. ДолженSELECTвернуть полноеCREATEопределение хранимой процедуры, которая будет использоваться на подписчике.Обратите внимание на использование требуемого
@artidпараметра.USE [PublisherDB]; GO CREATE OR ALTER PROCEDURE script_custom_delete (@artid INT) AS BEGIN SELECT 'CREATE OR ALTER PROCEDURE custom_delete @pkc1 INT AS BEGIN INSERT INTO DeleteLogging (id) VALUES (@pkc1) END'; RETURN 0; END GOЗарегистрируйте пользовательский скрипт на издателе.
USE [PublisherDB]; GO EXECUTE sp_register_custom_scripting @type = 'delete', @value = 'script_custom_delete', @publication = 'PubName1', @article = 'Purchases'; GOДобавление подписки В этом примере параметр
@sync_typeустановлен наreplication support only, поэтому моментальный снимок не используется.USE [PublisherDB]; GO EXECUTE sp_addsubscription @publication = N'PubName1', @subscriber = @@SERVERNAME, @destination_db = N'SubscriberDB', @subscription_type = N'Push', @sync_type = N'replication support only', @article = N'all', @update_mode = N'read only', @subscriber_type = 0; GO
Использование скрипта, содержащего новое определение пользовательской процедуры
При выполнении sp_addarticle задайте для @schema_option0x02 бит false , чтобы репликация не автоматически создавала пользовательские процедуры на подписчике.
Перед каждым изменением схемы создайте новый файл скрипта и зарегистрируйте скрипт с репликацией, выполнив sp_register_custom_scripting. Укажите значение custom_script параметра @type и путь к скрипту на издателе для параметра @value .
При следующем изменении соответствующей схемы этот скрипт выполняется у каждого подписчика в той же транзакции, что и команда DDL. После завершения изменений схемы регистрация скрипта отменяется. Необходимо повторно зарегистрировать скрипт, чтобы он выполнялся после последующего изменения схемы.