Membuat Perubahan Skema pada Database Publikasi

Berlaku untuk:SQL ServerAzure SQL Managed Instance

Replikasi mendukung berbagai perubahan skema pada objek yang diterbitkan. Saat Anda membuat salah satu perubahan skema berikut pada objek yang diterbitkan yang sesuai di Penerbit Microsoft SQL Server, perubahan tersebut disebarluaskan secara default ke semua Pelanggan SQL Server:

  • ALTER TABLE

  • ALTER TABLE SET LOCK ESCALATION tidak boleh digunakan jika replikasi perubahan skema diaktifkan dan topologi mencakup Pelanggan SQL Server 2005 (9.x) atau SQL Server Compact 3.5.

  • UBAH TAMPILAN

  • ALTER PROCEDURE

  • ALTER FUNCTION

  • UBAH PEMICU

    ALTER TRIGGER hanya dapat digunakan untuk pemicu bahasa manipulasi data [DML] karena pemicu bahasa definisi data [DDL] tidak dapat direplikasi.

Penting

Perubahan skema pada tabel harus dilakukan dengan menggunakan Transact-SQL atau SQL Server Management Objects (SMO). Saat perubahan skema dilakukan di SQL Server Management Studio, Management Studio mencoba untuk menghilangkan dan membuat ulang tabel. Anda tidak dapat menghilangkan objek yang diterbitkan, oleh karena itu perubahan skema gagal.

Untuk replikasi transaksional dan replikasi penggabungan, perubahan skema disebarkan secara bertahap ketika Agen Distribusi atau Agen Penggabungan berjalan. Untuk replikasi rekam jepret, perubahan skema disebarluaskan saat rekam jepret baru diterapkan di Pelanggan. Dalam replikasi rekam jepret, salinan baru skema dikirim ke Pelanggan setiap kali sinkronisasi terjadi. Oleh karena itu, semua perubahan skema (bukan hanya yang tercantum di atas) ke objek yang diterbitkan sebelumnya secara otomatis disebarluaskan dengan setiap sinkronisasi.

Untuk informasi tentang menambahkan dan menghapus artikel dari publikasi, lihat Menambahkan Artikel ke dan Menghapus Artikel dari Publikasi yang Ada.

Untuk mereplikasi perubahan skema

Perubahan skema yang tercantum di atas direplikasi secara default. Untuk informasi tentang menonaktifkan replikasi perubahan skema, lihat Mereplikasi Perubahan Skema.

Pertimbangan untuk Perubahan Skema

Ingatlah pertimbangan berikut saat mereplikasi perubahan skema.

Pertimbangan Umum

  • Perubahan skema tunduk pada batasan apa pun yang diberlakukan oleh Transact-SQL. Misalnya, ALTER TABLE tidak memungkinkan Anda mengubah kolom kunci utama.

  • Pemetaan jenis data hanya dilakukan untuk rekam jepret awal. Perubahan skema tidak dipetakan ke versi jenis data sebelumnya. Misalnya, jika pernyataan ALTER TABLE ADD datetime2 column digunakan dalam SQL Server 2012 (11.x), jenis data tidak diterjemahkan ke nvarchar untuk Pelanggan SQL Server 2005 (9.x). Dalam beberapa kasus, perubahan skema diblokir pada Publisher.

  • Jika publikasi diatur untuk memungkinkan penyebaran perubahan skema, perubahan skema disebarluaskan terlepas dari bagaimana opsi skema terkait diatur untuk artikel dalam publikasi. Misalnya, jika Anda memilih untuk tidak mereplikasi batasan kunci asing untuk artikel tabel, tetapi kemudian mengeluarkan perintah ALTER TABLE yang menambahkan kunci asing ke tabel di Penerbit, kunci asing ditambahkan ke tabel di Pelanggan. Untuk mencegah hal ini, nonaktifkan penyebaran perubahan skema sebelum mengeluarkan perintah ALTER TABLE.

  • Perubahan skema harus dilakukan hanya di Penerbit, bukan di Pelanggan (termasuk penerbitan ulang Pelanggan). Replikasi penggabungan mencegah perubahan skema di Pelanggan. Replikasi transaksional tidak mencegah perubahan, tetapi perubahan dapat menyebabkan replikasi gagal.

  • Perubahan yang disebarkan ke Pelanggan penerbitan ulang secara default disebarkan ke Pelanggannya.

  • Jika perubahan skema mereferensikan objek atau batasan yang ada di Penerbit tetapi tidak pada Pelanggan, perubahan skema akan berhasil pada Penerbit tetapi akan gagal pada Pelanggan.

  • Semua objek pada Pelanggan yang dirujuk saat menambahkan kunci asing harus memiliki nama dan pemilik yang sama dengan objek yang sesuai pada Penerbit.

  • Menambahkan, menghilangkan, atau mengubah indeks secara eksplisit tidak direplikasi dan perubahan apa pun yang melibatkan indeks eksplisit perlu dijalankan pada setiap set replika satu per satu. Indeks yang dibuat secara implisit untuk batasan (seperti batasan kunci primer) didukung.

  • Mengubah atau menghilangkan kolom identitas yang dikelola oleh replikasi tidak didukung. Untuk informasi selengkapnya tentang manajemen otomatis kolom identitas, lihat Mereplikasi Kolom Identitas.

  • Perubahan skema yang mencakup fungsi nondeterministik tidak didukung karena dapat mengakibatkan data di Penerbit dan Pelanggan berbeda (disebut sebagai non-konvergensi). Misalnya, jika Anda mengeluarkan perintah berikut di Publisher: ALTER TABLE SalesOrderDetail ADD OrderDate DATETIME DEFAULT GETDATE(), nilainya berbeda saat perintah direplikasi ke Pelanggan dan dijalankan. Untuk informasi selengkapnya tentang fungsi nondeterministik, lihat Fungsi Deterministik dan Nondeterministik.

  • Disarankan agar batasan diberi nama secara eksplisit. Jika batasan tidak diberi nama secara eksplisit, SQL Server menghasilkan nama untuk batasan, dan nama-nama ini akan berbeda pada Penerbit dan setiap Pelanggan. Ini dapat menyebabkan masalah selama replikasi perubahan skema. Misalnya, jika Anda menjatuhkan kolom di Publisher dan batasan dependen dihilangkan, replikasi akan mencoba menghilangkan batasan di Pelanggan. Penurunan di Pelanggan akan gagal karena nama batasannya berbeda. Jika sinkronisasi gagal karena masalah penamaan batasan, hilangkan batasan secara manual di Pelanggan lalu jalankan kembali Agen Penggabungan.

  • Jika tabel diterbitkan untuk replikasi, tidak dimungkinkan untuk mengubah kolom dalam tabel tersebut ke tipe data XML jika rekam jepret publikasi telah dibuat Untuk mengubah kolom, Anda harus terlebih dahulu menghapus replikasi.

  • Baca tidak dikomit bukan tingkat isolasi yang didukung saat melakukan DDL pada tabel yang diterbitkan.

  • SET CONTEXT_INFO tidak boleh digunakan untuk mengubah konteks transaksi di mana perubahan skema dilakukan terhadap objek yang diterbitkan.

Menambahkan Kolom

  • Untuk menambahkan kolom baru ke tabel dan menyertakan kolom tersebut dalam publikasi yang sudah ada, jalankan ALTER TABLE <Table> ADD <Column>. Secara default, kolom kemudian direplikasi ke semua Pelanggan. Kolom harus memperbolehkan nilai NULL atau menyertakan batasan default. Untuk informasi selengkapnya tentang menambahkan kolom, lihat bagian "Gabungkan Replikasi" dalam topik ini.

  • Untuk menambahkan kolom baru ke tabel dan tidak menyertakan kolom tersebut dalam publikasi yang sudah ada, nonaktifkan replikasi perubahan skema, lalu jalankan ALTER TABLE <Table> ADD <Column>.

  • Untuk menyertakan kolom yang sudah ada dalam publikasi yang sudah ada, gunakan sp_articlecolumn (Transact-SQL), sp_mergearticlecolumn (Transact-SQL), atau kotak dialog Properti Publikasi - <Publikasi> .

    Untuk informasi selengkapnya, lihat Menentukan dan Mengubah Filter Kolom. Ini akan mengharuskan langganan diinisialisasi ulang.

  • Menambahkan kolom identitas ke tabel yang diterbitkan tidak didukung, karena dapat mengakibatkan non-konvergensi saat kolom direplikasi ke Pelanggan. Nilai dalam kolom identitas di Publisher bergantung pada urutan baris untuk tabel yang terpengaruh disimpan secara fisik. Baris mungkin disimpan secara berbeda di Pelanggan; oleh karena itu, nilai untuk kolom identitas bisa berbeda untuk baris yang sama.

Menjatuhkan Kolom

  • Untuk menghilangkan kolom dari publikasi yang sudah ada dan meletakkan kolom dari tabel di Publisher, jalankan ALTER TABLE <Table> DROP <Column>. Secara default, kolom kemudian dihilangkan dari tabel di semua Pelanggan.

  • Untuk menghapus kolom dari publikasi yang sudah ada tetapi mempertahankan kolom dalam tabel di Publisher, gunakan sp_articlecolumn (Transact-SQL), sp_mergearticlecolumn (Transact-SQL), atau kotak dialog Properti Publikasi - <Publikasi> .

    Untuk informasi selengkapnya, lihat Menentukan dan Mengubah Filter Kolom. Ini akan memerlukan rekam jepret baru untuk dibuat.

  • Kolom yang akan dihilangkan tidak dapat digunakan dalam klausa filter dari artikel apa pun dari publikasi apa pun dalam database.

  • Saat menghilangkan kolom dari artikel yang diterbitkan, pertimbangkan batasan, indeks, atau properti kolom yang dapat memengaruhi database. Misalnya:

    • Anda tidak dapat menghilangkan kolom yang digunakan dalam kunci primer dari artikel dalam publikasi transaksional, karena digunakan oleh replikasi.

    • Anda tidak dapat menghilangkan kolom rowguid dari artikel dalam publikasi gabungan atau kolom mstran_repl_version dari artikel dalam publikasi transaksional yang mendukung pembaruan langganan, karena digunakan oleh replikasi.

    • Perubahan indeks tidak disebarkan ke Pelanggan: jika Anda menjatuhkan kolom di Publisher dan indeks dependen dihilangkan, penurunan indeks tidak direplikasi. Anda harus menghilangkan indeks di Pelanggan sebelum menghilangkan kolom di Publisher, sehingga penurunan kolom berhasil saat direplikasi dari Penerbit ke Pelanggan. Jika sinkronisasi gagal karena indeks di Pelanggan, hilangkan indeks secara manual lalu jalankan ulang Agen Penggabungan.

    • Batasan harus diberi nama secara eksplisit untuk memungkinkan penurunan. Untuk informasi selengkapnya, lihat bagian "Pertimbangan Umum" sebelumnya dalam topik ini.

Replikasi Transaksional

  • Perubahan skema disebarkan ke Pelanggan yang menjalankan versi SQL Server sebelumnya, tetapi pernyataan DDL hanya boleh menyertakan sintaks yang didukung oleh versi di Pelanggan.

    Jika Pelanggan menerbitkan ulang data, satu-satunya perubahan skema yang didukung adalah menambahkan dan menghilangkan kolom. Perubahan ini harus dilakukan pada Publisher menggunakan sp_repladdcolumn (Transact-SQL) dan sp_repldropcolumn (Transact-SQL) daripada mengubah sintaks TABLE DDL.

  • Perubahan skema tidak direplikasi ke Pelanggan non-SQL Server.

  • Perubahan skema tidak disebarluaskan dari Penerbit non-SQL Server.

  • Anda tidak dapat mengubah tampilan terindeks yang direplikasi sebagai tabel. Tampilan terindeks yang direplikasi karena tampilan terindeks dapat diubah, tetapi mengubahnya akan menyebabkan tampilan menjadi tampilan reguler, bukan tampilan terindeks.

  • Jika publikasi mendukung pembaruan segera atau pembaruan langganan antrean, sistem harus dihentikan sebelum membuat perubahan skema: semua aktivitas pada tabel yang diterbitkan harus dihentikan di Penerbit dan Pelanggan, dan perubahan data yang tertunda harus disebarkan ke semua simpul. Setelah perubahan skema disebarkan ke semua simpul, aktivitas dapat dilanjutkan pada tabel yang diterbitkan.

  • Jika publikasi berada dalam topologi peer-to-peer, sistem harus didiamkan sebelum membuat perubahan skema. Untuk informasi selengkapnya, lihat Menghentikan Topologi Replikasi (Pemrograman Transact-SQL Replikasi).

  • Menambahkan kolom tanda waktu ke tabel dan memetakan tanda waktu ke biner(8) menyebabkan artikel diinisialisasi ulang untuk semua langganan aktif.

Replikasi Penggabungan

  • Cara replikasi penggabungan menangani perubahan skema ditentukan oleh tingkat kompatibilitas publikasi, dan apakah rekam jepret diatur ke mode asli (default) atau mode karakter:

    • Untuk mereplikasi perubahan skema, tingkat kompatibilitas publikasi harus setidaknya 90RTM. Jika Pelanggan menjalankan versi SQL Server sebelumnya atau tingkat kompatibilitas kurang dari 90RTM, Anda dapat menggunakan sp_repladdcolumn (Transact-SQL) dan sp_repldropcolumn (Transact-SQL) untuk menambahkan dan menghilangkan kolom. Namun, prosedur ini tidak digunakan lagi.

    • Jika Anda mencoba menambahkan ke artikel yang sudah ada, kolom dengan jenis data yang diperkenalkan di SQL Server 2008 (10.0.x), SQL Server memiliki perilaku berikut:

      100RTM, rekam jepret asli 100RTM, rekam jepret karakter Semua tingkat kompatibilitas lainnya
      hierarchyid Perbolehkan perubahan Blokir perubahan Blokir perubahan
      geografi dan geometri Perbolehkan perubahan Izinkan perubahan* Blokir perubahan
      aliran file Perbolehkan perubahan Blokir perubahan Blokir perubahan
      tanggal, waktu, datetime2, dan datetimeoffset Perbolehkan perubahan Izinkan perubahan* Blokir perubahan

      *Pelanggan Ringkas SQL Server mengonversi jenis data ini di Pelanggan.

  • Jika terjadi kesalahan saat menerapkan perubahan skema (seperti kesalahan yang dihasilkan dari penambahan kunci asing yang mereferensikan tabel yang tidak tersedia di Pelanggan), sinkronisasi gagal dan langganan harus diinisialisasi ulang.

  • Jika perubahan skema dilakukan pada kolom yang terlibat dalam filter gabungan atau filter berparameter, Anda harus menginisialisasi ulang semua langganan dan meregenerasi rekam jepret.

  • Replikasi penggabungan menyediakan prosedur tersimpan untuk melewati perubahan skema selama pemecahan masalah. Untuk informasi selengkapnya, lihat sp_markpendingschemachange (Transact-SQL) dan sp_enumeratependingschemachanges (Transact-SQL).

Lihat Juga

ALTER TABLE (Transact-SQL)
ALTER VIEW (Transact-SQL)
ALTER PROCEDURE (Transact-SQL)
ALTER FUNCTION (Transact-SQL)
UBAH PEMICU (Transact-SQL)
Menerbitkan Objek Data dan Database
Meregenerasi Prosedur Transaksional Kustom untuk Mencerminkan Perubahan Skema