Udostępnij za pośrednictwem


Jak Definiowanie i modyfikowanie filtru kolumny (Programowanie replikacji Transact-SQL)

Podczas tworzenia tabela artykułów, można zdefiniować kolumny, które artykuł i zmienić kolumny po artykuł został zdefiniowany.Można tworzyć i modyfikować kolumny filtrowanej programowo za pomocą procedur przechowywanych replikacja.Niektóre typy kolumn, takie jak tożsamości i rowguid nie można usunąć kolumny z opublikowanego artykuł.Aby uzyskać więcej informacji, zobacz filtry kolumny w temacie Filtrowanie opublikowane dane.

Ostrzeżenie

Poniższe procedury zakładać, że tabela źródłowa nie uległa zmianie.Aby uzyskać informacje na replikowanie zmian (DDL) języka definicja danych opublikowanych tabel, zobacz Wprowadzanie zmian schematu na publikację baz danych.

Aby zdefiniować filtr kolumn artykuł, opublikowane w migawka lub transakcyjnych publikacja

  1. Zdefiniuj artykuł do filtrowania.Aby uzyskać więcej informacji, zobacz Jak Definiowanie artykuł (Programowanie replikacji Transact-SQL).

  2. Wydawca na baza danych publikacja, wykonanie sp_articlecolumn.Definiuje kolumny zawierają lub usunąć z artykuł.

    • Jeśli publikowanie tylko kilka kolumn z tabela z wieloma kolumnami wykonać sp_articlecolumn raz dla każdej kolumna dodawane.Określ nazwę kolumna dla kolumna @ i wartości dodać dla @ operacji.

    • Jeśli publikowanie większość kolumn w tabela z wieloma kolumnami, wykonać sp_articlecolumn, określając wartość null dla @ kolumna i wartości dodać dla @ operacji dodać wszystkie kolumna.Następnie wykonać sp_articlecolumn, po każdej z kolumn są wykluczone, określając wartość drop dla @ operacji i nazwa kolumna wykluczonych kolumna @.

  3. Wydawca na baza danych publikacja, wykonanie sp_articleview.Określ nazwę publikacja publikacja @ i nazwę artykuł filtrowane dla @ artykuł.Tworzy obiekty synchronizacji dla filtrowanych artykuł.

Aby zmienić filtr kolumn uwzględnienie dodatkowych kolumn artykuł, opublikowane w migawka lub transakcyjnych publikacja

  1. Wydawca na baza danych publikacja, wykonanie sp_articlecolumn raz dla każdej kolumna dodawane.Określ nazwę kolumna dla kolumna @ i wartości dodać dla @ operacji.

  2. Wydawca na baza danych publikacja, wykonanie sp_articleview.Określ nazwę publikacja publikacja @ i nazwę artykuł filtrowane dla @ artykuł.Jeśli publikacja ma istniejących subskrypcji, określ wartość 1 dla @ change_active.Odtwarza obiektów synchronizacji dla filtrowanych artykuł.

  3. Ponownie uruchom zadanie agenta migawka publikacja Generowanie zaktualizowanej migawka.

  4. Ponownie zainicjować subskrypcji.Aby uzyskać więcej informacji, zobacz Jak Ponownie zainicjować subskrypcję (Programowanie replikacji Transact-SQL).

Aby zmienić filtr kolumn usunąć kolumn artykuł, opublikowane w migawka lub transakcyjnych publikacja

  1. Wydawca na baza danych publikacja, wykonanie sp_articlecolumn raz dla każdej kolumna zostaną usunięte.Określ nazwę kolumna dla kolumna @ i wartości drop dla @ operacji.

  2. Wydawca na baza danych publikacja, wykonanie sp_articleview.Określ nazwę publikacja publikacja @ i nazwę artykuł filtrowane dla @ artykuł.Jeśli publikacja ma istniejących subskrypcji, określ wartość 1 dla @ change_active.Odtwarza obiektów synchronizacji dla filtrowanych artykuł.

  3. Ponownie uruchom zadanie agenta migawka publikacja Generowanie zaktualizowanej migawka.

  4. Ponownie zainicjować subskrypcji.Aby uzyskać więcej informacji, zobacz Jak Ponownie zainicjować subskrypcję (Programowanie replikacji Transact-SQL).

Aby zdefiniować filtr kolumn artykuł, opublikowana w publikacja seryjnej

  1. Zdefiniuj artykuł do filtrowania.Aby uzyskać więcej informacji, zobacz Jak Definiowanie artykuł (Programowanie replikacji Transact-SQL).

  2. Wydawca na baza danych publikacja, wykonanie sp_mergearticlecolumn.Definiuje kolumny zawierają lub usunąć z artykuł.

    • Jeśli publikowanie tylko kilka kolumn z tabela z wieloma kolumnami wykonać sp_mergearticlecolumn raz dla każdej kolumna dodawane.Określ nazwę kolumna dla kolumna @ i wartości dodać dla @ operacji.

    • Jeśli publikowanie większość kolumn w tabela z wieloma kolumnami, wykonać sp_mergearticlecolumn, określając wartość null dla @ kolumna i wartości dodać dla @ operacji dodać wszystkie kolumna.Następnie wykonać sp_mergearticlecolumn, po każdej z kolumn są wykluczone, określając wartość drop dla @ operacji i nazwa kolumna wykluczonych kolumna @.

Aby zmienić filtr kolumn uwzględnienie dodatkowych kolumn artykuł, opublikowane w publikacja seryjnej

  1. Wydawca na baza danych publikacja, wykonanie sp_mergearticlecolumn raz dla każdej kolumna dodawane.Określ nazwę kolumna dla kolumna @, wartość dodać dla @ operacji i wartości 1 dla obu @ force_invalidate_snapshot i @ force_reinit_subscription.

  2. Ponownie uruchom zadanie agenta migawka publikacja Generowanie zaktualizowanej migawka.

  3. Ponownie zainicjować subskrypcji.Aby uzyskać więcej informacji, zobacz Jak Ponownie zainicjować subskrypcję (Programowanie replikacji Transact-SQL).

Aby zmienić filtr kolumn usunąć kolumn artykuł, opublikowana w publikacja seryjnej

  1. Wydawca na baza danych publikacja, wykonanie sp_mergearticlecolumn raz dla każdej kolumna zostaną usunięte.Określ nazwę kolumna dla kolumna @, wartość drop dla @ operacji i wartości 1 dla obu @ force_invalidate_snapshot i @ force_reinit_subscription.

  2. Ponownie uruchom zadanie agenta migawka publikacja Generowanie zaktualizowanej migawka.

  3. Ponownie zainicjować subskrypcji.Aby uzyskać więcej informacji, zobacz Jak Ponownie zainicjować subskrypcję (Programowanie replikacji Transact-SQL).

Przykład

W tym replikacja transakcyjna przykład, DaysToManufacture kolumna zostanie usunięte na podstawie artykuł produktu tabela.

DECLARE @publication    AS sysname;
DECLARE @table AS sysname;
DECLARE @filterclause AS nvarchar(500);
DECLARE @filtername AS nvarchar(386);
DECLARE @schemaowner AS sysname;
SET @publication = N'AdvWorksProductTran'; 
SET @table = N'Product';
SET @filterclause = N'[DiscontinuedDate] IS NULL'; 
SET @filtername = N'filter_out_discontinued';
SET @schemaowner = N'Production';

-- Add a horizontally and vertically filtered article for the Product table.
-- Manually set @schema_option to ensure that the Production schema 
-- is generated at the Subscriber (0x8000000).
EXEC sp_addarticle 
    @publication = @publication, 
    @article = @table, 
    @source_object = @table,
    @source_owner = @schemaowner, 
    @schema_option = 0x80030F3,
    @vertical_partition = N'true', 
    @type = N'logbased',
    @filter_clause = @filterclause;

-- (Optional) Manually call the stored procedure to create the 
-- horizontal filtering stored procedure. Since the type is 
-- 'logbased', this stored procedures is executed automatically.
EXEC sp_articlefilter 
    @publication = @publication, 
    @article = @table, 
    @filter_clause = @filterclause, 
    @filter_name = @filtername;

-- Add all columns to the article.
EXEC sp_articlecolumn 
    @publication = @publication, 
    @article = @table;

-- Remove the DaysToManufacture column from the article
EXEC sp_articlecolumn 
    @publication = @publication, 
    @article = @table, 
    @column = N'DaysToManufacture', 
    @operation = N'drop';

-- (Optional) Manually call the stored procedure to create the 
-- vertical filtering view. Since the type is 'logbased', 
-- this stored procedures is executed automatically.
EXEC sp_articleview 
    @publication = @publication, 
    @article = @table,
    @filter_clause = @filterclause;
GO

W tym przykładzie replikacja scalająca CreditCardApprovalCode kolumna zostanie usunięte na podstawie artykuł SalesOrderHeader tabela.

DECLARE @publication AS sysname;
DECLARE @table1 AS sysname;
DECLARE @table2 AS sysname;
DECLARE @table3 AS sysname;
DECLARE @salesschema AS sysname;
DECLARE @hrschema AS sysname;
DECLARE @filterclause AS nvarchar(1000);
SET @publication = N'AdvWorksSalesOrdersMerge'; 
SET @table1 = N'Employee'; 
SET @table2 = N'SalesOrderHeader'; 
SET @table3 = N'SalesOrderDetail'; 
SET @salesschema = N'Sales';
SET @hrschema = N'HumanResources';
SET @filterclause = N'Employee.LoginID = HOST_NAME()';

-- Add a filtered article for the Employee table.
EXEC sp_addmergearticle 
  @publication = @publication, 
  @article = @table1, 
  @source_object = @table1, 
  @type = N'table', 
  @source_owner = @hrschema,
  @schema_option = 0x0004CF1,
  @description = N'article for the Employee table',
  @subset_filterclause = @filterclause;

-- Add an article for the SalesOrderHeader table that is filtered
-- based on Employee and horizontally filtered.
EXEC sp_addmergearticle 
  @publication = @publication, 
  @article = @table2, 
  @source_object = @table2, 
  @type = N'table', 
  @source_owner = @salesschema, 
  @vertical_partition = N'true',
  @schema_option = 0x0034EF1,
  @description = N'article for the SalesOrderDetail table';

-- Add an article for the SalesOrderDetail table that is filtered
-- based on SaledOrderHeader.
EXEC sp_addmergearticle 
  @publication = @publication, 
  @article = @table3, 
  @source_object = @table3, 
  @source_owner = @salesschema,
  @description = 'article for the SalesOrderHeader table', 
  @identityrangemanagementoption = N'auto', 
  @pub_identity_range = 100000, 
  @identity_range = 100, 
  @threshold = 80,
  @schema_option = 0x0004EF1;

-- Add all columns to the SalesOrderHeader article.
EXEC sp_mergearticlecolumn 
  @publication = @publication, 
  @article = @table2, 
  @force_invalidate_snapshot = 1, 
  @force_reinit_subscription = 1;

-- Remove the credit card Approval Code column.
EXEC sp_mergearticlecolumn 
  @publication = @publication, 
  @article = @table2, 
  @column = N'CreditCardApprovalCode', 
  @operation = N'drop', 
  @force_invalidate_snapshot = 1, 
  @force_reinit_subscription = 1;

-- Add a merge join filter between Employee and SalesOrderHeader.
EXEC sp_addmergefilter 
  @publication = @publication, 
  @article = @table2, 
  @filtername = N'SalesOrderHeader_Employee', 
  @join_articlename = @table1, 
  @join_filterclause = N'Employee.BusinessEntityID = SalesOrderHeader.SalesPersonID', 
  @join_unique_key = 1, 
  @filter_type = 1, 
  @force_invalidate_snapshot = 1, 
  @force_reinit_subscription = 1;

-- Add a merge join filter between SalesOrderHeader and SalesOrderDetail.
EXEC sp_addmergefilter 
  @publication = @publication, 
  @article = @table3, 
  @filtername = N'SalesOrderDetail_SalesOrderHeader', 
  @join_articlename = @table2, 
  @join_filterclause = N'SalesOrderHeader.SalesOrderID = SalesOrderDetail.SalesOrderID', 
  @join_unique_key = 1, 
  @filter_type = 1, 
  @force_invalidate_snapshot = 1, 
  @force_reinit_subscription = 1;
GO