Percebi que, quando você configura uma replicação transacional, o SQL Server define o gerenciamento do intervalo de identidades como manual. O que isso significa é que, no meu banco de dados de inscrição, quando tento inserir um novo registro em uma tabela cuja PK é uma coluna de identidade, ele gera um erro e diz que tentou inserir uma PK de "1", "2 "," 3 "etc. etc. Isso ocorre porque o valor atual da identidade de todas as colunas de identidade no assinante é redefinido para o valor inicial (geralmente 1) em vez de permanecer no que era no editor.
Entendo por que o SQL Server faz isso - você deve deixar a tabela de assinantes como somente leitura. No entanto, meu cenário é um pouco ortodoxo - eu atualizo meu assinante periodicamente através da replicação, faço um backup imediato desse banco de dados e desejo fazer algumas atualizações no assinante que NÃO serão enviadas de volta ao editor e, em seguida, Quando vou atualizar o assinante novamente, restauro o banco de dados do backup anterior e retiro as atualizações mais recentes. Como desejo fazer atualizações para o assinante entre essas atualizações ('deltas temporários', se desejar), preciso que a coluna de identidade funcione e não redefina para 1 quando replicada.
Tentei ativar o gerenciamento automático de intervalo de identidades ao configurar minha publicação, mas isso só me dá o seguinte erro ao tentar adicionar uma tabela à publicação:
Msg 21231, Nível 16, Estado 1, Procedimento sp_MSrepl_addarticle, Linha 2243
O suporte automático ao intervalo de identidade é útil apenas para publicações que permitem a atualização de assinantes.
Existe alguma maneira de contornar esse problema? Eu quero apresentar essa replicação no SQL Server como se fosse somente leitura no final do assinante, porque não pretendo fazer atualizações que serão enviadas de volta ao editor , mas quero fazer atualizações temporárias que será apagado antes da próxima replicação.
Também considerei que a replicação de instantâneo pode ser um método mais apropriado do que a replicação transacional para o meu padrão de uso, mas o problema é que a replicação de instantâneo exige o envio de todo o maldito banco de dados a cada atualização; porque estou planejando fazer um backup imediato do banco de dados após a última replicação, não preciso fazer essa transferência toda vez; apenas as mudanças desde a última vez.
Is there any way I can get round this problem?Você deve definir a coluna de identidade como NÃO PARA REPLICAÇÃO usando sys.sp_identitycolumnforreplication para sql server 2005 e versões posteriores . Você nem precisa refazer uma captura instantânea de seus artigos quando altera a coluna de identidade para não ser replicada. Apenas não faça isso usando GUI.