Поделиться через


Транзакционные статьи — повторно сгенерируйте пользовательские процедуры для отражения изменений в схеме.

Применимо к: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 хранимую процедуру.

  1. На подписчике создайте таблицу для демонстрации пользовательского скрипта удаления.

    USE [SubscriberDB];
    GO
    
    CREATE TABLE DeleteLogging (id INT PRIMARY KEY);
    GO
    
  2. Добавьте статью от издателя. Обратите внимание на значения значений @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
    
  3. Создайте хранимую процедуру, которая генерирует скрипт хранимой процедуры 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
    
  4. Зарегистрируйте пользовательский скрипт на издателе.

    USE [PublisherDB];
    GO
    
    EXECUTE sp_register_custom_scripting
        @type = 'delete',
        @value = 'script_custom_delete',
        @publication = 'PubName1',
        @article = 'Purchases';
    GO
    
  5. Добавление подписки В этом примере параметр @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. После завершения изменений схемы регистрация скрипта отменяется. Необходимо повторно зарегистрировать скрипт, чтобы он выполнялся после последующего изменения схемы.