Habilitar atualização de assinaturas para publicações transacionais

Aplica-se a:SQL Server

Este tópico mostra como habilitar a atualização de assinaturas para publicações transacionais no SQL Server usando o SQL Server Management Studio ou o Transact-SQL.

Observação

Esse recurso será removido em uma versão futura do SQL Server. Evite usar esse recurso em desenvolvimentos novos e planeje modificar os aplicativos que atualmente o utilizam.

Antes de começar

Segurança

Quando possível, solicite que os usuários insiram as credenciais de segurança em tempo de execução. Se for necessário armazenar credenciais em um arquivo de script, você deverá proteger o arquivo para impedir acesso não autorizado.

Como usar o SQL Server Management Studio.

Habilite as assinaturas de atualização para publicações transacionais na página Tipo de Publicação do Assistente para Nova Publicação.

Para usar assinaturas de atualização, você deve configurar também as opções no Assistente para Nova Assinatura.

Para habilitar assinaturas de atualização

  1. Na página Tipo de Publicação do Assistente para Nova Publicação, selecione Publicação transacional com assinaturas atualizáveis.

  2. Na página Segurança do Agente , especifique as definições do Queue Reader Agent além de Snapshot Agent e Log Reader Agent. Para obter mais informações sobre as permissões que são exigidas para a conta sob a qual o Queue Reader Agent executa, consulte Replication Agent Security Model.

    Observação

    O Agente de Leitor de Fila será configurado mesmo se você usar apenas a assinatura de atualização imediata.

Usando o Transact-SQL

Ao criar uma publicação transacional de forma programática usando procedimentos armazenados de replicação, é possível ativar tanto as assinaturas de atualização imediatas como em fila.

Para criar uma publicação que ofereça suporte a assinaturas de atualização imediatas

  1. Se necessário, crie um trabalho do Log Reader Agent para o banco de dados de publicação.

    • Se já existir um trabalho do Agente de Leitor de Log para o banco de dados de publicação, passe para a etapa 2.

    • Se você não estiver seguro quanto à existência de um trabalho do Agente do Leitor de Log para um banco de dados publicado, execute sp_helplogreader_agent (Transact-SQL) no Publicador do banco de dados de publicação. Se o conjunto de resultados estiver vazio, será preciso criar um trabalho do Log Reader Agent.

    • No publicador, execute sp_addlogreader_agent (Transact-SQL). Especifique as credenciais do Microsoft Windows com as quais o agente é executado para @job_name e @password. Se o agente usar a autenticação do SQL Server ao se conectar ao Publicador, será preciso especificar também um valor de 0 para @publisher_security_mode e as informações de logon do Microsoft SQL Server para @publisher_login e @publisher_password.

  2. Execute sp_addpublication (Transact-SQL) especificando um valor igual a true no parâmetro allow_sync_tran.

  3. No Publicador, execute sp_addpublication_snapshot (Transact-SQL). Especifique o nome da publicação usado na etapa 2 para @publication e as credenciais do Windows com as quais o Snapshot Agent será executado para @job_name e @password. Se o agente usar a autenticação do SQL Server ao se conectar ao Publicador, será preciso especificar também um valor de 0 para @publisher_security_mode e as informações de logon do SQL Server para @publisher_login e @publisher_password. Isso cria um trabalho do Agente de Instantâneo para a publicação.

  4. Adicione artigos à publicação. Para obter mais informações, consulte Define an Article.

  5. No Assinante, crie uma assinatura de atualização para essa publicação.

Para criar uma publicação que ofereça suporte a assinaturas de atualização em fila

  1. Se necessário, crie um trabalho do Log Reader Agent para o banco de dados de publicação.

    • Se já existir um trabalho do Agente de Leitor de Log para o banco de dados de publicação, passe para a etapa 2.

    • Se você não estiver seguro quanto à existência de um trabalho do Agente do Leitor de Log para um banco de dados publicado, execute sp_helplogreader_agent (Transact-SQL) no Publicador do banco de dados de publicação. Se o conjunto de resultados estiver vazio, será preciso criar um trabalho do Log Reader Agent.

    • No publicador, execute sp_addlogreader_agent (Transact-SQL). Especifique as credenciais do Windows com as quais o agente é executado para @job_name e @password. Se o agente usar a autenticação do SQL Server ao se conectar ao Publicador, será preciso especificar também um valor de 0 para @publisher_security_mode e as informações de logon do SQL Server para @publisher_login e @publisher_password.

  2. Se necessário, crie um trabalho do Queue Reader Agent para o Distribuidor.

    • Se já houver um trabalho do Queue Reader Agent para o banco de dados da distribuição, passe para a Etapa 3.

    • Se você não estiver seguro quando à existência do trabalho do Queue Reader Agent no banco de dados da distribuição, execute sp_helpqreader_agent (Transact-SQL) no Distribuidor do banco de dados de distribuição. Se o conjunto de resultados estiver vazio, será preciso criar um trabalho do Queue Reader Agent.

    • Para o Distribuidor, execute sp_addqreader_agent (Transact-SQL). Especifique as credenciais do Windows com as quais o agente é executado para @job_name e @password. Essas credenciais são usadas quando o Queue Reader Agent se conecta ao Publicador e ao Assinante. Para obter mais informações, consulte Replication Agent Security Model.

  3. Execute sp_addpublication (Transact-SQL) especificando um valor igual a true no parâmetro @allow_queued_tran e um valor igual a pub wins, sub reinit ou sub wins em @conflict_policy.

  4. No Publicador, execute sp_addpublication_snapshot (Transact-SQL). Especifique o nome de publicação usado na etapa 3 para @publication e as credenciais do Windows com as quais o Snapshot Agent é executado para @snapshot_job_name e @password. Se o agente usar a autenticação do SQL Server ao se conectar ao Publicador, será preciso especificar também um valor de 0 para @publisher_security_mode e as informações de logon do SQL Server para @publisher_login e @publisher_password. Isso cria um trabalho do Agente de Instantâneo para a publicação.

  5. Adicione artigos à publicação. Para obter mais informações, consulte Define an Article.

  6. No Assinante, crie uma assinatura de atualização para essa publicação.

Para alterar a política de conflito para uma publicação que permite assinatura de atualização em fila

  1. No Publicador do banco de dados de publicação, execute sp_changepublication (Transact-SQL). Especifique um valor de conflict_policy para @property , o modo de política de conflito desejado de pub wins, sub reinitou sub wins para @value.

Exemplo (Transact-SQL)

Esse exemplo cria uma publicação que oferece suporte às assinaturas pull imediatas e em fila.

-- To avoid storing the login and password in the script file, the values 
-- are passed into SQLCMD as scripting variables. 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".

--Declarations for adding a transactional publication
DECLARE @publicationDB AS sysname;
DECLARE @publication AS sysname;
DECLARE @login AS sysname;
DECLARE @password AS sysname;
SET @publicationDB = N'AdventureWorks2022'; 
SET @publication = N'AdvWorksProductTran'; 
SET @login = $(Login); 
SET @password = $(Password); 

USE [AdventureWorks2022]
-- Enable transactional replication on the publication database.
EXEC sp_replicationdboption 
    @dbname=@publicationDB, 
    @optname=N'publish',
    @value = N'true';

-- Execute sp_addlogreader_agent to create the agent job. 
EXEC sp_addlogreader_agent 
    @job_login = @login, 
    @job_password = @password,
    -- Explicitly specify the use of Windows Integrated Authentication (default) 
    -- when connecting to the Publisher.
    @publisher_security_mode = 1;

-- Create a transactional publication that supports immediate updating, 
-- queued updating, and pull subscriptions. 
EXEC sp_addpublication 
    @publication = @publication, 
    @status = N'active',
    @allow_sync_tran = N'true', 
    @allow_queued_tran = N'true',
    @allow_pull = N'true',
    @independent_agent = N'true',
  -- Explicitly declare the related default properties 
    @conflict_policy = N'pub wins';

-- Create a new snapshot job for the publication, using a default schedule.
EXEC sp_addpublication_snapshot 
    @publication = @publication, 
    @job_login = @login, 
    @job_password = @password,
    -- Explicitly specify the use of Windows Integrated Authentication (default) 
    -- when connecting to the Publisher.
    @publisher_security_mode = 1;
GO

--Declarations for adding an article.
DECLARE @publication AS sysname;
DECLARE @article AS sysname;
DECLARE @owner AS sysname;
SET @publication = N'AdvWorksProductTran';
SET @article = N'Product'; 
SET @owner = N'Production'; 

-- Add a horizontally and vertically filtered article for the Product table.
USE [AdventureWorks2022]
EXEC sp_addarticle 
    @publication = @publication, 
    @article = @article, 
    @source_table = @article, 
    @vertical_partition = N'false', 
    @type = N'logbased',
    @source_owner = @owner, 
    @destination_owner = @owner;
GO

Confira também

Definir opções de resolução de conflitos de atualização de fila (SQL Server Management Studio)
Replicação transacional
Updatable Subscriptions for Transactional Replication
Criar uma publicação
Create an Updatable Subscription to a Transactional Publication
Updatable Subscriptions for Transactional Replication
Usar sqlcmd com variáveis de script