Procédure : définir un article (programmation Transact-SQL de la réplication)

Une fois une publication créée, des articles peuvent être créés par programme en utilisant des procédures stockées de réplication. Les procédures stockées utilisées pour créer un article dépendent du type de publication pour laquelle l'article est défini. Pour plus d'informations, consultez Procédure : créer une publication (programmation Transact-SQL de la réplication).

Notes

Les noms d'article ne peuvent inclure aucun des caractères suivants : % , * , [ , ] , | , : , " , ? , ' , \ , / , < , >. Si des objets de la base de données incluent l'un de ces caractères et que vous souhaitez les répliquer, vous devez spécifier un nom d'article qui est différent du nom d'objet.

Pour définir un article pour une publication transactionnelle ou d'instantané

  1. Dans la base de données de publication sur le serveur de publication, exécutez sp_addarticle. Spécifiez le nom de la publication à laquelle l'article appartient pour @publication, le nom de l'article pour @article, l'objet de base de données qui est publié pour @source_object et tout autre paramètre optionnel. Utilisez @source_owner pour spécifier la propriété de schéma de l'objet, s'il ne s'agit pas de dbo. Si l'article n'est pas un article de table basé sur un journal, spécifiez le type d'article pour @type. Pour plus d'informations, consultez Procédure : spécifier des types d'articles (programmation Transact-SQL de la réplication).

  2. Pour filtrer horizontalement les lignes d'une table ou pour afficher un article, utilisez sp_articlefilter pour définir la clause du filtre. Pour plus d'informations, consultez Procédure : définir et modifier un filtre de lignes statique (programmation Transact-SQL de la réplication).

  3. Pour filtrer verticalement les colonnes d'une table ou afficher un article, utilisez sp_articlecolumn. Pour plus d'informations, consultez Procédure : définir et modifier un filtre de colonne (programmation Transact-SQL de la réplication).

  4. Exécutez sp_articleview si l'article est filtré.

  5. Si la publication contient des abonnements existants et si sp_helppublication retourne la valeur 0 dans la colonne immediate_sync, vous devez appeler sp_addsubscription pour ajouter l'article à chaque abonnement existant.

  6. Si la publication contient des abonnements par extraction existants, exécutez sp_refreshsubscriptions au niveau du serveur de publication de manière à créer un nouvel instantané pour les abonnements par extraction existants qui contient uniquement le nouvel article.

    Notes

    Pour les abonnements qui ne sont pas initialisés à l'aide d'un instantané, vous n'avez pas besoin d'exécuter sp_refreshsubscriptions puisque cette procédure est exécutée par sp_addarticle.

Pour définir un article pour une publication de fusion

  1. Dans la base de données de publication sur le serveur de publication, exécutez sp_addmergearticle. Spécifiez le nom de la publication pour @publication, le nom de l'article pour @article et l'objet qui est publié pour @source_object. Pour filtrer horizontalement les lignes d'une table, spécifiez une valeur pour @subset_filterclause. Pour plus d'informations, consultez Procédure : définir et modifier un filtre de lignes paramétrable pour un article de fusion (programmation Transact-SQL de la réplication) et Procédure : définir et modifier un filtre de lignes statique (programmation Transact-SQL de la réplication). Si l'article n'est pas un article de table, spécifiez le type d'article pour @type. Pour plus d'informations, consultez Procédure : spécifier des types d'articles (programmation Transact-SQL de la réplication).

  2. (Facultatif) Dans la base de données de publication sur le serveur de publication, exécutez sp_addmergefilter pour définir un filtre de jointure entre deux articles. Pour plus d'informations, consultez Procédure : définir et modifier un filtre de jointure entre des articles de fusion (programmation Transact-SQL de la réplication).

  3. (Facultatif) Dans la base de données de publication sur le serveur de publication, exécutez sp_mergearticlecolumn pour filtrer les colonnes d'une table. Pour plus d'informations, consultez Procédure : définir et modifier un filtre de colonne (programmation Transact-SQL de la réplication).

Exemple

Cet exemple définit un article basé sur la table Product pour une publication transactionnelle, où l'article est filtré à la fois horizontalement et verticalement.

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

Cet exemple définit des articles pour une publication de fusion, où l'article SalesOrderHeader est filtré statiquement sur SalesPersonID et où l'article SalesOrderDetail est filtré avec un filtre de jointure sur SalesOrderHeader.

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