Menentukan dan Mengubah Filter Baris Berparameter untuk Artikel Penggabungan

Berlaku untuk:SQL Server

Topik ini menjelaskan cara menentukan dan memodifikasi filter baris berparameter di SQL Server dengan menggunakan SQL Server Management Studio atau Transact-SQL.

Saat membuat artikel tabel, Anda bisa menggunakan filter baris berparameter. Filter ini menggunakan klausul WHERE untuk memilih data yang sesuai untuk diterbitkan. Daripada menentukan nilai harfiah dalam klausul (seperti yang Anda lakukan dengan filter baris statis), Anda menentukan salah satu atau kedua fungsi sistem berikut: SUSER_SNAME dan HOST_NAME. Untuk informasi selengkapnya, lihat Filter Baris Berparameter.

Dalam Topik Ini

Sebelum Anda mulai

Batasan dan Pembatasan

  • Jika Anda menambahkan, memodifikasi, atau menghapus filter baris berparameter setelah langganan ke publikasi telah diinisialisasi, Anda harus membuat rekam jepret baru dan menginisialisasi ulang semua langganan setelah melakukan perubahan. Untuk informasi selengkapnya tentang persyaratan perubahan properti, lihat Mengubah Publikasi dan Properti Artikel.

Rekomendasi

  • Untuk alasan performa, kami sarankan Anda tidak menerapkan fungsi ke nama kolom dalam klausa filter baris berparameter, seperti LEFT([MyColumn]) = SUSER_SNAME(). Jika Anda menggunakan HOST_NAME dalam klausa filter dan mengambil alih nilai HOST_NAME, mungkin perlu mengonversi jenis data menggunakan CONVERT. Untuk informasi selengkapnya tentang praktik terbaik untuk kasus ini, lihat bagian "Mengganti nilai HOST_NAME() dalam topik Filter Baris Berparameter.

Menggunakan SQL Server Management Studio

Tentukan, ubah, dan hapus filter baris berparameter pada halaman Filter Baris Tabel dari Panduan Publikasi Baru atau halaman Filter Baris dari kotak dialog Properti Publikasi - <Publikasi> . Untuk informasi selengkapnya tentang menggunakan panduan dan mengakses kotak dialog, lihat Membuat Publikasi dan Menampilkan dan Mengubah Properti Publikasi.

Untuk menentukan filter baris berparameter

  1. Pada halaman Filter Baris Tabel dari Panduan Publikasi Baru atau halaman Filter Baris dari Properti Publikasi - <Publikasi>, klik Tambahkan, lalu klik Tambahkan Filter.

  2. Dalam kotak dialog Tambahkan Filter , pilih tabel untuk difilter dari kotak daftar drop-down.

  3. Buat pernyataan filter di kotak teks Pernyataan filter. Anda bisa mengetik langsung di area teks, dan Anda juga bisa menyeret dan meletakkan kolom dari kotak daftar Kolom .

    • Area teks Pernyataan filter menyertakan teks default, yang dalam bentuk:

      SELECT <published_columns> FROM [tableowner].[tablename] WHERE  
      
    • Teks default tidak dapat diubah; ketik klausa filter setelah kata kunci WHERE menggunakan sintaks SQL standar. Filter berparameter mencakup panggilan ke fungsi sistem HOST_NAME() dan/atau SUSER_SNAME(), atau fungsi yang ditentukan pengguna yang mereferensikan salah satu atau kedua fungsi ini. Berikut ini adalah contoh klausa filter lengkap untuk filter baris berparameter:

      SELECT <published_columns> FROM [HumanResources].[Employee] WHERE LoginID = SUSER_SNAME()  
      

      Klausa WHERE harus menggunakan penamaan dua bagian; penamaan tiga bagian dan penamaan empat bagian tidak didukung.

  4. Pilih opsi yang cocok dengan bagaimana data akan dibagikan di antara Pelanggan:

    • Baris dari tabel ini akan masuk ke beberapa langganan

    • Baris dari tabel ini hanya akan masuk ke satu langganan

    Jika Anda memilih Baris dari tabel ini hanya akan masuk ke satu langganan, replikasi penggabungan dapat mengoptimalkan performa dengan menyimpan dan memproses lebih sedikit metadata. Namun, Anda harus memastikan bahwa data dipartisi sedih sehingga baris tidak dapat direplikasi ke lebih dari satu Pelanggan. Untuk informasi selengkapnya, lihat bagian "Mengatur 'opsi partisi'" dalam topik Filter Baris Berparameter.

  5. Pilih OK.

  6. Jika Anda berada dalam kotak dialog Properti Publikasi - <Publikasi> , klik OK untuk menyimpan dan menutup kotak dialog.

Untuk mengubah filter baris berparameter

  1. Pada halaman Filter Baris Tabel dari Panduan Publikasi Baru atau halaman Filter Baris dari Properti Publikasi - <Publikasi>, pilih filter di panel Tabel Yang Difilter, lalu klik Edit.

  2. Dalam kotak dialog Edit Filter , ubah filter.

  3. Pilih OK.

Untuk menghapus filter baris berparameter

  1. Pada halaman Filter Baris Tabel dari Panduan Publikasi Baru atau halaman Filter Baris dari Properti Publikasi - <Publikasi>, pilih filter di panel Tabel Yang Difilter, lalu klik Hapus.

Menggunakan T-SQL

Filter baris berparameter dapat dibuat dan dimodifikasi secara terprogram menggunakan prosedur tersimpan replikasi.

Untuk menentukan filter baris berparameter untuk artikel dalam publikasi gabungan

  1. Di Publisher pada database publikasi, jalankan sp_addmergearticle (Transact-SQL). Tentukan @publication, nama untuk artikel untuk @article, tabel yang diterbitkan untuk @source_object, klausa WHERE yang menentukan filter parameter untuk @subset_filterclause (tidak termasuk WHERE), dan salah satu nilai berikut untuk @partition_options, yang menjelaskan jenis partisi yang akan dihasilkan dari filter baris parameter:

    • 0 - Pemfilteran untuk artikel bersifat statis atau tidak menghasilkan subset data unik untuk setiap partisi (partisi "tumpang tindih").

    • 1 - Partisi yang dihasilkan tumpang tindih, dan pembaruan yang dibuat di Pelanggan tidak dapat mengubah partisi tempat baris berada.

    • 2 - Pemfilteran untuk artikel menghasilkan partisi yang tidak tumpang tindih, tetapi beberapa Pelanggan dapat menerima partisi yang sama.

    • 3 - Pemfilteran untuk artikel menghasilkan partisi yang tidak tumpang tindih yang unik untuk setiap langganan.

Untuk mengubah filter baris berparameter untuk artikel dalam publikasi gabungan

  1. Di Publisher pada database publikasi, jalankan sp_changemergearticle. Tentukan @publication, @article, nilai subset_filterclause untuk @property, ekspresi yang menentukan filter berparameter untuk @value (tidak termasuk WHERE), dan nilai 1 untuk @force_invalidate_snapshot dan @force_reinit_subscription.

  2. Jika perubahan ini menghasilkan perilaku partisi yang berbeda, jalankan sp_changemergearticle lagi. Tentukan @publication, @article, nilai partition_options untuk @property, dan opsi pemartisian yang paling tepat untuk @value, yang bisa menjadi salah satu dari berikut ini:

    • 0 - Pemfilteran untuk artikel bersifat statis atau tidak menghasilkan subset data unik untuk setiap partisi (partisi "tumpang tindih").

    • 1 - Partisi yang dihasilkan tumpang tindih, dan pembaruan yang dibuat di Pelanggan tidak dapat mengubah partisi tempat baris berada.

    • 2 - Pemfilteran untuk artikel menghasilkan partisi yang tidak tumpang tindih, tetapi beberapa Pelanggan dapat menerima partisi yang sama.

    • 3 - Pemfilteran untuk artikel menghasilkan partisi yang tidak tumpang tindih yang unik untuk setiap langganan.

Contoh (Transact-SQL)

Contoh ini mendefinisikan sekelompok artikel dalam publikasi gabungan di mana artikel difilter dengan serangkaian filter gabungan terhadap Employee tabel yang difilter sendiri menggunakan filter baris berparameter pada kolom LoginID . Selama sinkronisasi, nilai yang dikembalikan oleh fungsi HOST_NAME ditimpa. Untuk informasi selengkapnya, lihat Mengganti Nilai HOST_NAME() dalam topik Filter Baris Berparameter.

-- To avoid storing the login and password in the script file, the value 
-- is passed into SQLCMD as a scripting variable. For information about 
-- how to use scripting variables on the command line and in SQL Server
-- Management Studio, see the "Executing Replication Scripts" section in
-- the topic "Programming Replication Using System Stored Procedures".

--Add a new merge publication.
DECLARE @publicationdb AS sysname;
DECLARE @publication AS sysname;
DECLARE @table1 AS sysname;
DECLARE @table2 AS sysname;
DECLARE @filter AS sysname;
DECLARE @schema_hr AS sysname;
DECLARE @schema_sales AS sysname;

SET @publicationdb = N'AdventureWorks2022';
SET @publication = N'AdvWorksSalesPersonMerge';
SET @table1 = N'Employee';
SET @table2 = N'SalesPerson';
SET @filter = N'SalesPerson_Employee';
SET @schema_hr = N'HumanResources';
SET @schema_sales = N'Sales';

USE [AdventureWorks2022];

-- Enable AdventureWorks2022 for merge replication.
EXEC sp_replicationdboption
  @dbname = @publicationdb,
  @optname = N'merge publish',
  @value = N'true';  

-- Create new merge publication with Subscriber requested snapshot
-- and using the default agent schedule. 
EXEC sp_addmergepublication 
  @publication = @publication, 
  @description = N'Merge publication of AdventureWorks2022.', 
  @allow_subscriber_initiated_snapshot = N'true',
  @publication_compatibility_level = N'90RTM';

-- Create a new snapshot job for the publication, using the default schedule.
-- Pass credentials at runtime using sqlcmd scripting variables.
EXEC sp_addpublication_snapshot 
  @publication = @publication, 
  @job_login = $(login), 
  @job_password = $(password);

-- Add an article for the Employee table, 
-- which is horizontally partitioned using 
-- a parameterized row filter.
EXEC sp_addmergearticle 
  @publication = @publication, 
  @article = @table1, 
  @source_owner = @schema_hr, 
  @source_object = @table1, 
  @type = N'table', 
  @description = 'contains employee information', 
  @subset_filterclause = N'[LoginID] = HOST_NAME()';

-- Add an article for the SalesPerson table, 
-- which is partitioned based on a join filter.
EXEC sp_addmergearticle 
  @publication = @publication, 
  @article = @table2, 
  @source_owner = @schema_sales, 
  @source_object = @table2, 
  @type = N'table', 
  @description = 'contains salesperson information';

-- Add a join filter between the two articles.
EXEC sp_addmergefilter 
  @publication = @publication, 
  @article = @table1, 
  @filtername = @filter, 
  @join_articlename = @table2, 
  @join_filterclause = N'[Employee].[BusinessEntityID] = [SalesPerson].[SalesPersonID]', 
  @join_unique_key = 1, 
  @filter_type = 1;
GO

-- Start the agent job to generate the full snapshot for the publication.
-- The filtered data snapshot is generated automatically the first time 
-- the subscription is synchronized. 
DECLARE @publication AS sysname;
SET @publication = N'AdvWorksSalesPersonMerge';

EXEC sp_startpublication_snapshot 
  @publication = @publication;
GO

Lihat Juga

Tentukan dan Ubah Filter Gabungan Antara Artikel Penggabungan
Mengubah Properti Publikasi dan Artikel
Filter Gabungan
Filter Baris Berparameter