Artikel transaksional - Meregenerasi prosedur kustom untuk mencerminkan perubahan skema

Berlaku untuk: SQL ServerAzure SQL Managed Instance

Secara bawaan, replikasi transaksional membuat semua perubahan data pada Subscriber melalui prosedur simpan yang dihasilkan oleh prosedur internal, untuk setiap artikel dari tabel yang dipublikasikan. Tiga prosedur (masing-masing satu untuk sisipan, pembaruan, dan penghapusan) disalin ke Pelanggan dan dijalankan saat penyisipan, pembaruan, atau penghapusan direplikasi ke Pelanggan.

Ketika perubahan skema dilakukan pada tabel pada Penerbit SQL Server, replikasi meregenerasi prosedur ini secara otomatis dengan memanggil kumpulan prosedur skrip internal yang sama sehingga prosedur baru cocok dengan skema baru (replikasi perubahan skema tidak didukung untuk Penerbit Oracle).

Anda juga dapat menentukan prosedur kustom untuk menggantikan satu atau beberapa prosedur default. Prosedur kustom harus diubah jika perubahan skema memengaruhi prosedur. Misalnya, jika prosedur mereferensikan kolom yang dihilangkan dalam perubahan skema, referensi ke kolom harus dihapus dari prosedur.

Ada dua cara untuk replikasi untuk menyebarluaskan prosedur kustom baru kepada Pelanggan:

  • Gunakan prosedur pembuatan skrip kustom untuk mengganti default yang digunakan oleh replikasi
  • Menggunakan skrip yang berisi definisi prosedur kustom baru

Gunakan prosedur pembuatan skrip kustom untuk mengganti default yang digunakan oleh replikasi

Ketika Anda menjalankan sp_addarticle, pastikan bit @schema_option0x02 adalah untuk true.

Nota

Definisi prosedur tersimpan kustom harus diskrip menggunakan Transact-SQL dinamis, di dalam prosedur tersimpan pembungkus. Prosedur tersimpan pembungkus ini juga harus menyertakan parameter @artid dengan tipe int, untuk memastikan bahwa itu dibuat pada berlangganan.

Jalankan sp_register_custom_scripting dan tentukan nilai insert, , updateatau delete untuk parameter @type , dan nama prosedur pembuatan skrip kustom untuk parameter @value .

Lain kali perubahan skema dilakukan, replikasi memanggil prosedur tersimpan ini untuk membuat skrip definisi untuk prosedur tersimpan kustom yang ditentukan pengguna baru, lalu menyebarluaskan prosedur ke setiap Pelanggan.

Contoh

Dalam contoh ini, asumsikan bahwa Penerbit dan Pelanggan sudah dikonfigurasi, dan Anda ingin membuat prosedur tersimpan kustom delete .

  1. Pada Pengguna Langganan, buat tabel untuk menampilkan skrip penghapusan yang disesuaikan.

    USE [SubscriberDB];
    GO
    
    CREATE TABLE DeleteLogging (id INT PRIMARY KEY);
    GO
    
  2. Tambahkan artikel dari Publisher. Perhatikan nilai parameter @schema_option, @ins_cmd, @upd_cmd, dan @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. Buat prosedur tersimpan yang membentuk skrip dari prosedur tersimpan custom_delete yang ingin Anda gunakan pada Langganan. Ini adalah prosedur tersimpan pembungkus (wrapper), seperti yang telah dijelaskan sebelumnya.

    Mengembalikan nilai bukan nol dari prosedur tersimpan ini mengakibatkan custom_delete tidak dibuat pada Subscriber. SELECT harus mengembalikan definisi lengkap CREATE prosedur tersimpan yang akan digunakan oleh Penerima Langganan.

    Perhatikan penggunaan parameter yang diperlukan @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. Daftarkan skrip kustom di Publisher.

    USE [PublisherDB];
    GO
    
    EXECUTE sp_register_custom_scripting
        @type = 'delete',
        @value = 'script_custom_delete',
        @publication = 'PubName1',
        @article = 'Purchases';
    GO
    
  5. Tambahkan langganan. Dalam contoh ini, @sync_type parameter diatur ke replication support only, sehingga tidak ada rekam jepret yang digunakan.

    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
    

Menggunakan skrip yang berisi definisi prosedur kustom baru

Saat Anda menjalankan sp_addarticle, atur bit @schema_option0x02 agar false replikasi tidak secara otomatis menghasilkan prosedur kustom di Subscriber.

Sebelum setiap perubahan skema, buat file skrip baru dan daftarkan skrip dengan replikasi dengan menjalankan sp_register_custom_scripting. Tentukan nilai custom_script untuk parameter @type , dan jalur ke skrip pada Publisher untuk parameter @value .

Lain kali perubahan skema yang relevan dilakukan, skrip ini dijalankan pada setiap Pelanggan dalam transaksi yang sama dengan perintah DDL. Setelah perubahan skema dilakukan, skrip tidak terdaftar. Anda harus mendaftarkan ulang skrip untuk menjalankannya setelah perubahan skema berikutnya.