Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Aplica-se a:SQL Server
Azure SQL Managed Instance
A replicação transacional permite especificar como as alterações de dados são propagadas do Publicador para os Assinantes. Para cada tabela publicada, você pode especificar uma das quatro maneiras pelas quais cada operação (INSERT, UPDATE ou DELETE) deve ser propagada para o Assinante:
Especifique que a replicação transacional deve criar scripts e, posteriormente, chamar um procedimento armazenado para propagar alterações para Assinantes (o padrão).
Especifique que a alteração deve ser propagada usando uma instrução INSERT, UPDATE ou DELETE (o padrão para assinantes que não sejam do SQL Server).
Especifique que um procedimento armazenado personalizado deve ser usado.
Especifique que esta ação não deve ser executada em nenhum Assinante. As transações desse tipo não são replicadas.
Por padrão, a replicação transacional propaga as alterações para os Assinantes por meio de um conjunto de procedimentos armazenados instalados em cada Assinante. Quando ocorre uma inserção, atualização ou eliminação numa tabela no Publicador, a operação é traduzida numa chamada para um procedimento armazenado no Subscritor. O procedimento armazenado aceita parâmetros que correspondem às colunas na tabela, permitindo que essas colunas sejam alteradas em Assinante.
Para definir o método de propagação para alterações de dados em artigos transacionais, consulte Definir o método de propagação para alterações de dados para artigos transacionais.
Procedimentos armazenados padrão e personalizados
Os três procedimentos que a replicação cria por padrão para cada artigo de tabela são:
sp_MSins_<tablename>, que manipula inserções.
sp_MSupd_<nome da tabela>, que lida com atualizações.
sp_MSdel_<tablename>, que manipula exclusões.
O <tablename> utilizado no procedimento depende de como o artigo foi adicionado à publicação e se a base de dados de subscrição contém uma tabela com o mesmo nome, mas com um dono diferente.
Qualquer um desses procedimentos pode ser substituído por um procedimento personalizado especificado ao adicionar um artigo a uma publicação. Os procedimentos personalizados são utilizados quando uma aplicação requer lógica específica, como a inserção de dados numa tabela de auditoria quando uma linha é atualizada num subscritor. Para obter mais informações sobre como especificar procedimentos armazenados personalizados, consulte os tópicos de instruções listados acima.
Se você especificar os procedimentos de replicação padrão ou os procedimentos personalizados, também especificará a sintaxe de chamada para cada procedimento (a replicação selecionará os padrões se você usar os procedimentos padrão). A sintaxe da chamada determina a estrutura dos parâmetros fornecidos ao procedimento e a quantidade de informações que são enviadas ao Assinante a cada alteração de dados. Para obter mais informações, consulte a seção "Sintaxe de chamada para procedimentos armazenados" neste tópico.
Considerações sobre o uso de procedimentos armazenados personalizados
Tenha em mente as seguintes considerações ao usar procedimentos armazenados personalizados:
Você deve suportar a lógica no procedimento armazenado; A Microsoft não fornece suporte para lógica personalizada.
A fim de evitar conflitos com as transações utilizadas pela replicação, as transações explícitas não devem ser utilizadas nos procedimentos aduaneiros.
O esquema no Assinante é normalmente idêntico ao esquema no Publicador, mas também pode ser um subconjunto do esquema do Publicador se a filtragem de coluna for usada. No entanto, se precisar transformar o esquema enquanto os dados são movidos, de forma que o esquema no Subscritor não seja um subconjunto do esquema no Publicador, o SQL Server 2019 Integration Services (SSIS) é a solução recomendada. Para obter mais informações, consulte SQL Server Integration Services.
Se você fizer alterações de esquema em uma tabela publicada, os procedimentos personalizados deverão ser regenerados. Para obter mais informações, consulte Regenerar procedimentos transacionais personalizados para refletir alterações de estrutura.
Se utilizar um valor maior que 1 para o parâmetro -SubscriptionStreams do Distribution Agent, deve garantir que as atualizações nas colunas de chave primária sejam bem-sucedidas. Por exemplo:
update ... set pk = 2 where pk = 1 -- update 1 update ... set pk = 3 where pk = 2 -- update 2Se o Distribution Agent usar mais de uma conexão, essas duas atualizações poderão ser replicadas em conexões diferentes. Se a atualização 1 for aplicada primeiro, não há problema; Se a atualização 2 for aplicada primeiro, ela retornará '0 linhas afetadas' porque a atualização 1 ainda não ocorreu. Essa situação é tratada nos procedimentos padrão, gerando um erro se nenhuma linha for afetada em uma atualização:
if @@rowcount = 0 if @@microsoftversion>0x07320000 exec sys.sp_MSreplraiserror 20598O aumento do erro força o Distribution Agent a repetir as atualizações em uma única conexão, o que será bem-sucedido. Os procedimentos armazenados personalizados devem incluir lógica semelhante.
Sintaxe de chamada para procedimentos armazenados
Há cinco opções para a sintaxe usada para chamar os procedimentos usados pela replicação transacional:
Sintaxe CALL. Pode ser usado para inserções, atualizações e exclusões. Por padrão, a replicação usa essa sintaxe para inserções e exclusões.
Sintaxe SCALL. Pode ser usado apenas para atualizações. Por padrão, a replicação usa essa sintaxe para atualizações.
Sintaxe MCALL. Pode ser usado apenas para atualizações.
Sintaxe XCALL. Pode ser usado para atualizações e exclusões.
VCALL. Usado para assinaturas atualizáveis. Apenas para uso interno.
Cada método difere na quantidade de dados que são propagados para o assinante. Por exemplo, SCALL passa valores somente para as colunas que são realmente afetadas por uma atualização. XCALL, por outro lado, requer todas as colunas (afetadas por uma atualização ou não) e todos os valores de dados antigos para cada coluna. Em muitos casos, o SCALL é apropriado para atualizações, mas se o seu aplicativo exigir todos os valores de dados durante uma atualização, o XCALL permitirá isso.
Sintaxe CALL
INSERIR procedimentos armazenados
Os procedimentos armazenados que manipulam instruções INSERT receberão os valores inseridos para todas as colunas:
c1, c2, c3,... cn
ATUALIZAR procedimentos armazenados
Os procedimentos armazenados que manipulam instruções UPDATE receberão os valores atualizados para todas as colunas definidas no artigo, seguidos pelos valores originais para as colunas de chave primária (nenhuma tentativa é feita para determinar quais colunas foram alteradas.):
c1, c2, c3,... cn, pkc1, pkc2, pkc3,... pkcn
EXCLUIR procedimentos armazenados
Os procedimentos armazenados que manipulam instruções DELETE receberão os valores para as colunas de chave primária.
pkc1, pkc2, pkc3,... pkcn
Sintaxe do SCALL
ATUALIZAR procedimentos armazenados
Os procedimentos armazenados que manipulam instruções UPDATE receberão os valores atualizados somente para as colunas que foram alteradas, seguidos pelos valores originais para as colunas de chave primária, seguidos por uma máscara de bits (parâmetro binário(n)) que indica as colunas alteradas. No exemplo a seguir, a coluna 2 (c2) não foi alterada:
c1, , c3,... cn, pkc1, pkc2, pkc3,... pkcn, bitmask
Sintaxe MCALL
ATUALIZAR procedimentos armazenados
Os procedimentos armazenados que manipulam instruções UPDATE receberão os valores atualizados para todas as colunas definidas no artigo, seguidos pelos valores originais para as colunas de chave primária, seguidos por um parâmetro bitmask (binary(n)) que indica as colunas alteradas:
c1, c2, c3,... cn, pkc1, pkc2, pkc3,... pkcn, bitmask
Sintaxe XCALL
ATUALIZAR procedimentos armazenados
Os procedimentos armazenados que manipulam instruções UPDATE receberão os valores originais (a imagem anterior) para todas as colunas definidas no artigo, seguidos pelos valores atualizados (a imagem depois) para todas as colunas definidas no artigo:
old-c1, old-c2, old-c3,... old-cn, c1, c2, c3,... cn,
EXCLUIR procedimentos armazenados
Os procedimentos armazenados que manipulam instruções DELETE receberão os valores originais (a imagem anterior) para todas as colunas definidas no artigo:
old-c1, old-c2, old-c3,... old-cn
Observação
Ao usar XCALL, espera-se que os valores antes da imagem para as colunas de texto e de imagem sejam NULL.
Exemplos
Os procedimentos a seguir são os procedimentos padrão criados para o Vendor Table no banco de dados de exemplo da Adventure Works.
--INSERT procedure using CALL syntax
create procedure [sp_MSins_PurchasingVendor]
@c1 int,@c2 nvarchar(15),@c3 nvarchar(50),@c4 tinyint,@c5 bit,@c6 bit,@c7 nvarchar(1024),@c8 datetime
as
begin
insert into [Purchasing].[Vendor]([VendorID]
,[AccountNumber]
,[Name]
,[CreditRating]
,[PreferredVendorStatus]
,[ActiveFlag]
,[PurchasingWebServiceURL]
,[ModifiedDate])
values (
@c1
,@c2
,@c3
,@c4
,@c5
,@c6
,@c7
,@c8
)
end
go
--UPDATE procedure using SCALL syntax
create procedure [sp_MSupd_PurchasingVendor]
@c1 int = null,@c2 nvarchar(15) = null,@c3 nvarchar(50) = null,@c4 tinyint = null,@c5 bit = null,@c6 bit = null,@c7 nvarchar(1024) = null,@c8 datetime = null,@pkc1 int
,@bitmap binary(2)
as
begin
update [Purchasing].[Vendor] set
[AccountNumber] = case substring(@bitmap,1,1) & 2 when 2 then @c2 else [AccountNumber] end
,[Name] = case substring(@bitmap,1,1) & 4 when 4 then @c3 else [Name] end
,[CreditRating] = case substring(@bitmap,1,1) & 8 when 8 then @c4 else [CreditRating] end
,[PreferredVendorStatus] = case substring(@bitmap,1,1) & 16 when 16 then @c5 else [PreferredVendorStatus] end
,[ActiveFlag] = case substring(@bitmap,1,1) & 32 when 32 then @c6 else [ActiveFlag] end
,[PurchasingWebServiceURL] = case substring(@bitmap,1,1) & 64 when 64 then @c7 else [PurchasingWebServiceURL] end
,[ModifiedDate] = case substring(@bitmap,1,1) & 128 when 128 then @c8 else [ModifiedDate] end
where [VendorID] = @pkc1
if @@rowcount = 0
if @@microsoftversion>0x07320000
exec sp_MSreplraiserror 20598
end
go
--DELETE procedure using CALL syntax
create procedure [sp_MSdel_PurchasingVendor]
@pkc1 int
as
begin
delete [Purchasing].[Vendor]
where [VendorID] = @pkc1
if @@rowcount = 0
if @@microsoftversion>0x07320000
exec sp_MSreplraiserror 20598
end
go