Sdílet prostřednictvím


Transakční články – Opětovné vygenerování vlastních procedur tak, aby odrážely změny schématu

platí pro:SQL Serverazure SQL Managed Instance

Ve výchozím nastavení transakční replikace provádí všechny změny dat u odběratelů prostřednictvím uložených procedur, které jsou generovány interními postupy, pro každý článek tabulky v publikaci. Tři procedury (každá z nich pro vložení, aktualizace a odstranění) se zkopírují do odběratele a provedou se, když je vložení, aktualizace nebo odstranění replikováno odběrateli.

Když dojde ke změně schématu v tabulce v aplikaci SQL Server Publisher, replikace tyto postupy automaticky vygeneruje voláním stejné sady interních skriptovacích procedur tak, aby nové postupy odpovídaly novému schématu (replikace změn schématu není podporována pro Oracle Publishers).

Můžete také zadat vlastní procedury, které nahradí jeden nebo více výchozích procedur. Vlastní postupy by se měly změnit, pokud změna schématu ovlivní proceduru. Pokud například procedura odkazuje na sloupec, který je vynechán ve změně schématu, měly by být odkazy na sloupec odebrány z procedury.

Existují dva způsoby, jak replikace může předat novou vlastní proceduru odběratelům:

  • Použití vlastního postupu skriptování k nahrazení výchozích hodnot používaných replikací
  • Použití skriptu, který obsahuje novou definici vlastní procedury

Použití vlastního postupu skriptování k nahrazení výchozích hodnot používaných replikací

Při spuštění sp_addarticle se ujistěte, že je bit @schema_option0x02 nastaven na true.

Poznámka:

Definice vlastní uložené procedury musí být skriptována pomocí dynamické Transact-SQL uvnitř obálkové uložené procedury. Procedura obálka musí také obsahovat parametr @artid typu int, aby se zajistilo, že je vytvořena na odběrateli.

Spusťte sp_register_custom_scripting a zadejte hodnotu parametru insertupdatedelete a název vlastního skriptovacího postupu pro parametr @value.

Při příští změně schématu volá replikace tuto uloženou proceduru, aby skriptoval definici pro novou uživatelsky definovanou vlastní uloženou proceduru a poté rozšíří proceduru do každého odběratele.

Příklad

V tomto příkladu předpokládejme, že vydavatel a odběratel jsou již nakonfigurovány a chcete vytvořit vlastní delete uloženou proceduru.

  1. Na odběrateli vytvořte tabulku, která předvede vlastní skript pro odstranění.

    USE [SubscriberDB];
    GO
    
    CREATE TABLE DeleteLogging (id INT PRIMARY KEY);
    GO
    
  2. Přidejte článek z Publisheru. Všimněte si hodnot parametru @schema_option, @ins_cmd, @upd_cmda @del_cmd parametrů:

    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. Vytvořte uloženou proceduru, která vygeneruje skript pro uloženou proceduru custom_delete, kterou chcete použít na odběrateli. Toto je procedura typu wrapper uložená v systému, jak bylo uvedeno dříve.

    Vrácení nenulových hodnot z této uložené procedury vede k tomu, že custom_delete se na odběrateli nevytvoří. Procedura SELECT by měla vrátit úplnou CREATE definici uložené procedury, která bude použita pro příjemce.

    Poznamenejte si použití požadovaného @artid parametru.

    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. Zaregistrujte vlastní skript v Publisheru.

    USE [PublisherDB];
    GO
    
    EXECUTE sp_register_custom_scripting
        @type = 'delete',
        @value = 'script_custom_delete',
        @publication = 'PubName1',
        @article = 'Purchases';
    GO
    
  5. Přidejte předplatné. V tomto příkladu @sync_type je parametr nastaven na replication support only, takže se nepoužívá žádný snímek.

    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
    

Použití skriptu, který obsahuje novou definici vlastní procedury

Při spuštění sp_addarticle nastavte @schema_option0x02 bit tak, aby false replikace automaticky nevygenerovala vlastní procedury u odběratele.

Před každou změnou schématu vytvořte nový soubor skriptu a zaregistrujte skript s replikací spuštěním sp_register_custom_scripting. Zadejte hodnotu custom_script parametru @type a cestu ke skriptu v Publisheru pro parametr @value .

Při příští změně příslušného schématu se tento skript spustí u každého odběratele ve stejné transakci jako příkaz DDL. Po provedení změny schématu se skript neregistruje. Skript je nutné znovu zaregistrovat, aby se spustil po následné změně schématu.