Dela via


Transaktionsartiklar – Återskapa anpassade procedurer för att återspegla schemaändringar

Gäller för:SQL ServerAzure SQL Managed Instance

Som standard gör transaktionsreplikering alla dataändringar hos Prenumeranter genom lagrade procedurer som genereras av interna procedurer, för varje tabellartikel i publikationen. De tre procedurerna (en var för infogningar, uppdateringar och borttagningar) kopieras till Prenumeranten och körs när en infogning, uppdatering eller borttagning replikeras till prenumeranten.

När en schemaändring görs i en tabell i en SQL Server Publisher återskapar replikeringen dessa procedurer automatiskt genom att anropa samma uppsättning interna skriptprocedurer så att de nya procedurerna matchar det nya schemat (replikering av schemaändringar stöds inte för Oracle Publishers).

Du kan också ange anpassade procedurer för att ersätta en eller flera av standardprocedurerna. De anpassade procedurerna bör ändras om schemaändringen påverkar proceduren. Om en procedur till exempel refererar till en kolumn som tas bort i en schemaändring, bör referenser till kolumnen tas bort från proceduren.

Det finns två sätt för replikering att sprida en ny anpassad procedur till prenumeranter:

  • Använd en anpassad skriptprocedur för att ersätta standardvärdena som används av replikering
  • Använda ett skript som innehåller en ny definition för anpassad procedur

Använd en anpassad skriptprocedur för att ersätta standardvärdena som används av replikering

När du kör sp_addarticle kontrollerar du att den @schema_option0x02 biten är till true.

Anmärkning

Definitionen för anpassad lagrad procedur måste skrivas med dynamisk Transact-SQL i en lagrad wrapper-procedur. Den här lagrade omslutningsproceduren måste också innehålla en @artid parameter av typen int för att säkerställa att den skapas på prenumeranten.

Kör sp_register_custom_scripting och ange värdet insert, updateeller delete för parametern @type och namnet på den anpassade skriptproceduren för parametern @value .

Nästa gång en schemaändring görs anropar replikeringen den här lagrade proceduren för att skriva ut definitionen för den nya användardefinierade anpassade lagrade proceduren och sprider sedan proceduren till varje prenumerant.

Exempel

I det här exemplet förutsätter du att utgivaren och prenumeranten redan är konfigurerade och att du vill skapa en anpassad delete lagrad procedur.

  1. I Prenumeranten skapar du en tabell för att visa det anpassade borttagningsskriptet.

    USE [SubscriberDB];
    GO
    
    CREATE TABLE DeleteLogging (id INT PRIMARY KEY);
    GO
    
  2. Lägg till artikeln från Publisher. Observera värdena för parametrarna @schema_option, @ins_cmd, @upd_cmdoch @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. Skapa en lagrad procedur som skriptar ut den custom_delete lagrade procedur som du vill använda på prenumeranten. Det här är den omslutningsprocedur som tidigare angivits.

    Om du returnerar värden som inte är noll från den här lagrade proceduren, resulterar det i att custom_delete inte skapas på prenumeranten. SELECT ska returnera den fullständiga definitionen av den lagrade proceduren som ska användas på prenumeranten.

    Observera användningen av den obligatoriska @artid parametern.

    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. Registrera det anpassade skriptet i Publisher.

    USE [PublisherDB];
    GO
    
    EXECUTE sp_register_custom_scripting
        @type = 'delete',
        @value = 'script_custom_delete',
        @publication = 'PubName1',
        @article = 'Purchases';
    GO
    
  5. Lägg till en prenumeration. I det här exemplet är parametern @sync_type inställd på replication support only, så ingen ögonblicksbild används.

    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
    

Använda ett skript som innehåller en ny definition för anpassad procedur

När du kör sp_addarticle, sätt @schema_option0x02-biten till false så att replikeringen inte automatiskt genererar anpassade procedurer på prenumeranten.

Innan varje schemaändring skapar du en ny skriptfil och registrerar skriptet med replikering genom att köra sp_register_custom_scripting. Ange värdet custom_script för parametern @type och sökvägen till skriptet i Publisher för parametern @value .

Nästa gång en relevant schemaändring görs körs det här skriptet på varje prenumerant inom samma transaktion som DDL-kommandot. När schemaändringen har gjorts avregistreras skriptet. Du måste registrera skriptet igen för att det ska köras efter en efterföljande schemaändring.