Eu tenho uma configuração de publicação de replicação de instantâneo no servidor 1. O servidor 2 assina a publicação no servidor 1. Os dados estão sendo replicados com êxito.
O trabalho do Agente Distribuidor e do Agente para o Assinante do Servidor 2 é executado no Servidor 1 (onde reside o banco de dados do Distribuidor).
Criei um procedimento armazenado no Servidor 2 para descartar (pré-replicação) e criar (pós-replicação) entidades vinculadas ao esquema no banco de dados de assinantes do Servidor 2. (Eu fiz isso com sucesso no passado porque a Snapshot Replication pode parar se houver entidades no banco de dados do assinante que estejam vinculadas ao esquema às entidades replicadas.)
Eu também criei um script que executa este procedimento armazenado do Servidor 1 por meio de um servidor vinculado ao Servidor 2. (Verifiquei se o servidor vinculado está configurado corretamente e posso consultar dados e executar manualmente o procedimento armazenado por meio do servidor vinculado do Servidor 1 para o servidor 2.) Adicionei este script às propriedades "Snapshot" da publicação de instantâneo:
Inicialmente, recebi um erro no trabalho do Snapshot Agent porque meu Snapshot Agent não tinha acesso de compartilhamento de arquivos ao caminho nos scripts, mas adicionei essa conta e, em seguida, o erro desapareceu e o trabalho do Snapshot foi concluído com êxito agora.
Mas as entidades no script SQL não são descartadas ou criadas e não vejo erros em nenhum lugar. Eu também tentei mover o arquivo de script antes e depois para um compartilhamento de pasta local para o Servidor 1 e referenciá-lo com um caminho UNC (em oposição ao caminho de rede na captura de tela) e ainda não houve alteração no comportamento.
Atualizei o script TEST.sql com um teste bem simples com o seguinte código:
INSERT INTO DatabaseA.dbo.Table1 (Field1) -- DatabaseA is on Server1, so it should insert to the local table
SELECT 'Test' AS Field1
Quando executo novamente o Snapshot Agent, ele ainda é executado com êxito, mas a tabela não é inserida (no Servidor 1).
Por que meus pré e pós-scripts não estão sendo executados, mas também não estou recebendo nenhum erro?
(Também tenho outra publicação para replicação transacional no servidor 1 que está sincronizando dados perfeitamente com o servidor 2 no mesmo banco de dados que a replicação de instantâneo. Publicação Transacional no Servidor 1, ainda não recebo erros e o SQL não é executado.)
Edit: Eu também tentei mover o arquivo de script para uma pasta local do Servidor 1, dando ao Snapshot Agent acesso de leitura a essa pasta e arquivo de script e re-executando o Snapshot Agent, e ainda nada. Sem execução do script e sem erros.
MAS, curiosamente, se eu modificar manualmente o próprio trabalho do Subscription Agent e adicionar uma etapa para executar a mesma consulta SQL exata, ele funcionará.
Também notei que o trabalho do SQL Agent é executado em uma conta SQL diferente "sqlmin" do que eu esperava para determinadas etapas (novas etapas que criei ou a primeira etapa do trabalho chamada "mensagem de inicialização do Snapshot Agent" - acho que porque essas etapas não são t do tipo "REPL-Distribuidor"). Mas as outras etapas pré-existentes executam como o SQL Agent que designei, que é "DBReplication". A conta "sqlmin" que conheço tem permissões SQL mínimas no Servidor 1 e no Servidor 2, pode ser por isso que os scripts de pré e pós-replicação não estão sendo executados (mas também não estou recebendo um erro em nenhum lugar) quando eu definir os scripts nos campos pré e pós das propriedades Snapshot Publication - Snapshot?
Também detalhes adicionais sobre a conta do distribuidor (que também é minha conta do Snapshot Agent): O distribuidor é uma conta do Windows AD que possui um LOGIN SQL no Servidor 1 e no Servidor 2 e com a função SQL de db_owner na origem e no destino replicados bancos de dados, bem como db_owner no banco de dados de distribuição (que reside no Servidor 1).
Apenas um breve resumo de algumas das coisas que eu tentaria, ao analisar as várias opções....
Você já tentou passar o identificador de objeto de quatro partes nos scripts?
Ao invés de usar:
Tente usar:
Ou no seu caso onde você está usando o Linked Server seria:
Onde você define os valores como:
Depende de onde o script deve modificar os dados. Isso não está muito claro em sua descrição, mas visto que você mencionou servidores vinculados, pensei em mencioná-lo.
O script é executado no Assinante conforme explicado em:
E as informações adicionais fornecidas aqui são muito importantes:
Referência: Modificar opções de inicialização de instantâneo para replicação SQL (Microsoft | SQL Docs)
Se o script não funcionar em conjunto com a conta usada para o agente de assinatura e em conjunto com sqlcmd , ele não funcionará na assinatura.
Então você pode querer dar uma olhada no artigo Solucionador de problemas: localizar erros com a replicação transacional do SQL Server . Eu não estou dizendo que você não fez isso ainda, mas você não disse que tinha. Quem sabe, talvez você possa encontrar o problema no histórico de trabalho do agente de replicação...
repostando meu comentário como resposta
extraia abaixo de BoL "Você pode especificar scripts para executar AT THE SUBSCRIBER (minha ênfase, também conhecido como Server2) antes ou depois que o snapshot é aplicado. Scripts podem ser usados por vários motivos, como criar logins e esquemas (proprietários de objetos) em cada Assinante."
https://learn.microsoft.com/en-us/sql/relational-databases/replication/snapshot-options?view=sql-server-ver15