sys.sp_cdc_enable_table (T-SQL)

Berlaku untuk:SQL Server

Memungkinkan perubahan pengambilan data untuk tabel sumber yang ditentukan dalam database saat ini. Saat tabel diaktifkan untuk mengubah pengambilan data, rekaman setiap operasi bahasa manipulasi data (DML) yang diterapkan ke tabel ditulis ke log transaksi. Proses pengambilan data perubahan mengambil informasi ini dari log dan menulisnya untuk mengubah tabel yang diakses dengan menggunakan sekumpulan fungsi.

Mengubah pengambilan data tidak tersedia di setiap edisi SQL Server. Untuk daftar fitur yang didukung oleh edisi SQL Server, lihat Edisi dan fitur yang didukung SQL Server 2022.

Konvensi sintaks transact-SQL

Sintaks

sys.sp_cdc_enable_table
    [ @source_schema = ] 'source_schema'
      , [ @source_name = ] 'source_name'
    [ , [ @capture_instance = ] 'capture_instance' ]
    [ , [ @supports_net_changes = ] supports_net_changes ]
      , [ @role_name = ] 'role_name'
    [ , [ @index_name = ] 'index_name' ]
    [ , [ @captured_column_list = ] N'captured_column_list' ]
    [ , [ @filegroup_name = ] 'filegroup_name' ]
    [ , [ @allow_partition_switch = ] 'allow_partition_switch' ]
[ ; ]

Argumen

[ @source_schema = ] 'source_schema'

Nama skema tempat tabel sumber berada. @source_schema adalah sysname, tanpa default, dan tidak boleh NULL.

[ @source_name = ] 'source_name'

Nama tabel sumber untuk mengaktifkan perubahan pengambilan data. @source_name adalah sysname, tanpa default, dan tidak boleh NULL.

source_name harus ada di database saat ini. Tabel dalam cdc skema tidak dapat diaktifkan untuk mengubah pengambilan data.

[ @role_name = ] 'role_name'

Nama peran database yang digunakan untuk gerbang akses untuk mengubah data. @role_name adalah sysname dan harus ditentukan. Jika secara eksplisit diatur ke NULL, tidak ada peran gating yang digunakan untuk membatasi akses ke data perubahan.

Jika peran saat ini ada, peran tersebut digunakan. Jika peran tidak ada, upaya dilakukan untuk membuat peran database dengan nama yang ditentukan. Nama peran dipangkas dari spasi kosong di sebelah kanan string sebelum mencoba membuat peran. Jika pemanggil tidak berwenang untuk membuat peran dalam database, operasi prosedur tersimpan gagal.

[ @capture_instance = ] 'capture_instance'

Nama instans pengambilan yang digunakan untuk memberi nama objek penangkapan data perubahan khusus instans. @capture_instance adalah sysname dan tidak boleh NULL.

Jika tidak ditentukan, nama berasal dari nama skema sumber ditambah nama tabel sumber dalam format <schemaname>_<sourcename>. @capture_instance tidak boleh melebihi 100 karakter dan harus unik dalam database. Baik yang ditentukan atau diturunkan, @capture_instance dipangkas dari spasi kosong apa pun di sebelah kanan string.

Tabel sumber dapat memiliki maksimal dua instans pengambilan. Untuk informasi selengkapnya, lihat, sys.sp_cdc_help_change_data_capture (Transact-SQL).

[ @supports_net_changes = ] supports_net_changes

Menunjukkan apakah dukungan untuk mengkueri perubahan bersih akan diaktifkan untuk instans tangkapan ini. @supports_net_changes sedikit dengan default 1 jika tabel memiliki kunci primer atau tabel memiliki indeks unik yang telah diidentifikasi dengan menggunakan parameter @index_name. Jika tidak, parameter default ke 0.

  • Jika 0, hanya fungsi dukungan yang akan dikueri untuk semua perubahan yang dihasilkan.
  • Jika 1, fungsi yang diperlukan untuk mengkueri perubahan bersih juga dihasilkan.

Jika @supports_net_changes diatur ke 1, @index_name harus ditentukan, atau tabel sumber harus memiliki kunci primer yang ditentukan.

Saat @supports_net_changes diatur ke 1, indeks non-kluster tambahan dibuat pada tabel perubahan, dan fungsi kueri perubahan bersih dibuat. Karena indeks ini perlu dipertahankan, mengaktifkan perubahan bersih dapat berdampak negatif pada performa CDC.

[ @index_name = ] 'index_name'

Nama indeks unik yang digunakan untuk mengidentifikasi baris secara unik dalam tabel sumber. @index_name adalah sysname dan dapat berupa NULL. Jika ditentukan, @index_name harus berupa indeks unik yang valid pada tabel sumber. Jika @index_name ditentukan, kolom indeks yang diidentifikasi lebih diutamakan daripada kolom kunci utama yang ditentukan sebagai pengidentifikasi baris unik untuk tabel.

[ @captured_column_list = ] N'captured_column_list'

Mengidentifikasi kolom tabel sumber yang akan disertakan dalam tabel perubahan. @captured_column_list adalah nvarchar(max) dan dapat berupa NULL. Jika NULL, semua kolom disertakan dalam tabel perubahan.

Nama kolom harus berupa kolom yang valid dalam tabel sumber. Kolom yang ditentukan dalam indeks kunci utama, atau kolom yang ditentukan dalam indeks yang dirujuk oleh @index_name harus disertakan.

@captured_column_list adalah daftar nama kolom yang dipisahkan koma. Nama kolom individual dalam daftar dapat dikutip secara opsional dengan menggunakan tanda kutip ganda ("") atau tanda kurung siku ([]). Jika nama kolom berisi koma yang disematkan, nama kolom harus dikutip.

@captured_column_list tidak boleh berisi nama kolom yang dipesan berikut: __$start_lsn, , __$end_lsn, __$seqval__$operation, dan __$update_mask.

[ @filegroup_name = ] 'filegroup_name'

Grup file yang akan digunakan untuk tabel perubahan yang dibuat untuk instans pengambilan. @filegroup_name adalah sysname dan dapat berupa NULL. Jika ditentukan, @filegroup_name harus ditentukan untuk database saat ini. Jika NULL, grup file default digunakan.

Sebaiknya buat grup file terpisah untuk mengubah tabel perubahan tangkapan data.

[ @allow_partition_switch = ] 'allow_partition_switch'

Menunjukkan apakah perintah SWITCH PARTITION dari ALTER TABLE dapat dijalankan terhadap tabel yang diaktifkan untuk mengubah pengambilan data. @allow_partition_switch adalah bit, dengan default .1

Untuk tabel yang tidak dipartisi, pengaturan sakelar selalu 1, dan pengaturan aktual diabaikan. Jika sakelar secara eksplisit diatur ke untuk 0 tabel yang tidak dipartisi, peringatan 22857 dikeluarkan untuk menunjukkan bahwa pengaturan pengalihan telah diabaikan. Jika sakelar secara eksplisit diatur ke untuk 0 tabel yang dipartisi, peringatan 22356 dikeluarkan untuk menunjukkan bahwa operasi pengalihan partisi pada tabel sumber tidak diizinkan. Terakhir, jika pengaturan pengalihan diatur secara eksplisit ke 1 atau diizinkan untuk default ke 1 dan tabel yang diaktifkan dipartisi, peringatan 22855 dikeluarkan untuk menunjukkan bahwa sakelar partisi tidak akan diblokir. Jika terjadi pengalihan partisi, ubah pengambilan data tidak melacak perubahan yang dihasilkan dari sakelar. Hal ini menyebabkan inkonsistensi data saat data perubahan digunakan.

PARTISI SWITCH adalah operasi metadata, tetapi menyebabkan perubahan data. Perubahan data yang terkait dengan operasi ini tidak diambil dalam tabel perubahan tangkapan data perubahan. Pertimbangkan tabel yang memiliki tiga partisi, dan perubahan dilakukan pada tabel ini. Proses penangkapan melacak operasi sisipan, pembaruan, dan penghapusan pengguna yang dijalankan terhadap tabel. Namun, jika partisi dialihkan ke tabel lain (misalnya, untuk melakukan penghapusan massal), baris yang dipindahkan sebagai bagian dari operasi ini tidak diambil sebagai baris yang dihapus dalam tabel perubahan. Demikian pula, jika partisi baru yang memiliki baris yang telah diisi sebelumnya ditambahkan ke tabel, baris ini tidak tercermin dalam tabel perubahan. Ini dapat menyebabkan inkonsistensi data ketika perubahan dikonsumsi oleh aplikasi dan diterapkan ke tujuan.

Jika Anda mengaktifkan pengalihan partisi di SQL Server, Anda mungkin juga perlu membagi dan menggabungkan operasi dalam waktu dekat. Sebelum menjalankan operasi pemisahan atau penggabungan pada tabel yang diaktifkan atau CDC yang direplikasi, pastikan bahwa partisi yang dimaksud tidak memiliki perintah yang direplikasi yang tertunda. Anda juga harus memastikan bahwa tidak ada operasi DML yang dijalankan pada partisi selama operasi pemisahan dan penggabungan. Jika ada transaksi yang belum diproses oleh pembaca log atau pekerjaan penangkapan CDC, atau jika operasi DML dilakukan pada partisi tabel yang diaktifkan CDC atau direplikasi sementara operasi pemisahan atau penggabungan dijalankan (melibatkan partisi yang sama), itu dapat menyebabkan kesalahan pemrosesan (kesalahan 608 - Tidak ada entri katalog yang ditemukan untuk ID partisi) dengan agen pembaca log atau pekerjaan penangkapan CDC. Untuk memperbaiki kesalahan, mungkin memerlukan reinisialisasi langganan atau menonaktifkan CDC pada tabel atau database tersebut.

Mengembalikan nilai kode

0 (berhasil) atau 1 (kegagalan).

Tataan hasil

Tidak ada.

Keterangan

Sebelum Anda bisa mengaktifkan tabel untuk mengubah pengambilan data, database harus diaktifkan. Untuk menentukan apakah database diaktifkan untuk mengubah pengambilan data, kueri is_cdc_enabled kolom dalam tampilan katalog sys.databases . Untuk mengaktifkan database, gunakan prosedur tersimpan sys.sp_cdc_enable_db .

Saat mengubah tangkapan data diaktifkan untuk tabel, tabel perubahan dan satu atau dua fungsi kueri dihasilkan. Tabel perubahan berfungsi sebagai repositori untuk perubahan tabel sumber yang diekstrak dari log transaksi oleh proses pengambilan. Fungsi kueri digunakan untuk mengekstrak data dari tabel perubahan. Nama-nama fungsi ini berasal dari parameter @capture_instance dengan cara berikut:

  • Semua fungsi perubahan: cdc.fn_cdc_get_all_changes_<capture_instance>
  • Fungsi perubahan bersih: cdc.fn_cdc_get_net_changes_<capture_instance>

sys.sp_cdc_enable_table juga membuat pekerjaan pengambilan dan pembersihan untuk database jika tabel sumber adalah tabel pertama dalam database yang akan diaktifkan untuk mengubah pengambilan data dan tidak ada publikasi transaksi untuk database. Ini mengatur is_tracked_by_cdc kolom dalam tampilan katalog sys.tables ke 1.

SQL Server Agent tidak harus berjalan saat CDC diaktifkan untuk tabel. Namun, proses penangkapan tidak memproses log transaksi dan menulis entri ke tabel perubahan kecuali Agen SQL Server berjalan.

Izin

Memerlukan keanggotaan dalam peran database tetap db_owner .

Contoh

J. Aktifkan ubah pengambilan data dengan menentukan hanya parameter yang diperlukan

Contoh berikut memungkinkan perubahan pengambilan data untuk HumanResources.Employee tabel. Hanya parameter yang diperlukan yang ditentukan.

USE AdventureWorks2022;
GO

EXECUTE sys.sp_cdc_enable_table
    @source_schema = N'HumanResources',
    @source_name = N'Employee',
    @role_name = N'cdc_Admin';
GO

B. Aktifkan ubah pengambilan data dengan menentukan parameter opsional tambahan

Contoh berikut memungkinkan perubahan pengambilan data untuk HumanResources.Department tabel. Semua parameter kecuali @allow_partition_switch ditentukan.

USE AdventureWorks2022;
GO

EXEC sys.sp_cdc_enable_table
    @source_schema = N'HumanResources',
    @source_name = N'Department',
    @role_name = N'cdc_admin',
    @capture_instance = N'HR_Department',
    @supports_net_changes = 1,
    @index_name = N'AK_Department_Name',
    @captured_column_list = N'DepartmentID, Name, GroupName',
    @filegroup_name = N'PRIMARY';
GO