Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Quando você atribui uma propriedade IDENTITY a uma coluna, o Microsoft SQL Server gera automaticamente números sequenciais para novas linhas inseridas na tabela que contém a coluna de identidade. Para obter mais informações, consulte IDENTITY (Propriedade) (Transact-SQL). Como as colunas de identidade podem ser incluídas como parte da chave primária, é importante evitar valores duplicados nas colunas de identidade. Para usar colunas de identidade em uma topologia de replicação que tenha atualizações em mais de um nó, cada nó na topologia de replicação deve usar um intervalo diferente de valores de identidade, para que as duplicatas não ocorram.
Por exemplo, o Publicador pode receber o intervalo de 1 a 100, o Assinante A no intervalo de 101 a 200 e o Assinante B no intervalo de 201 a 300. Se uma linha for inserida no Publicador e o valor da identidade for, por exemplo, 65, esse valor será replicado para cada Assinante. Quando a replicação insere dados em cada Assinante, ela não incrementa o valor da coluna de identidade na tabela do Assinante; em vez disso, o valor literal 65 é inserido. Somente inserções de usuário, mas não inserções de agente de replicação, fazem com que o valor da coluna de identidade seja incrementado.
A replicação manipula colunas de identidade em todos os tipos de publicação e assinatura, permitindo que você gerencie as colunas manualmente ou faça com que a replicação as gerencie automaticamente.
Observação
Não há suporte para a adição de uma coluna de identidade a uma tabela publicada, pois ela pode resultar em não convergência quando a coluna é replicada para o Assinante. Os valores na coluna de identidade no Publicador dependem da ordem em que as linhas da tabela afetada são armazenadas fisicamente. As linhas podem ser armazenadas de forma diferente no Assinante; portanto, o valor da coluna de identidade pode ser diferente para as mesmas linhas.
Especificando uma opção de gerenciamento de intervalo de identidade
A replicação oferece três opções de gerenciamento de intervalo de identidade:
Automático. Usado para replicação por mesclagem e replicação transacional com atualizações no subscritor. Especifique intervalos de tamanho para o Publicador e Assinantes e a replicação gerencia automaticamente a atribuição de novos intervalos. A replicação define a opção NOT FOR REPLICATION na coluna de identidade no Assinante, de modo que somente as inserções do usuário façam com que o valor seja incrementado no Assinante.
Observação
Os assinantes devem sincronizar com o Publicador para receber novos intervalos. Como os Assinantes recebem intervalos de identidade automaticamente, é possível que qualquer Assinante esgote todo o fornecimento de intervalos de identidade se solicitar repetidamente novos intervalos.
Manual. Usado para replicação transacional e de instantâneo sem atualizações no Assinante, replicação transacional ponto a ponto, ou quando seu aplicativo deve realizar o controle programático de intervalos de identidade. Se você especificar o gerenciamento manual, deverá garantir que os intervalos sejam atribuídos ao Publicador e a cada Assinante e que novos intervalos sejam atribuídos se os intervalos iniciais forem usados. A replicação define a opção NOT FOR REPLICATION na coluna de identidade no assinante.
Nenhum. Essa opção é recomendada apenas para compatibilidade com versões anteriores do SQL Server e só está disponível na interface de procedimento armazenado para publicações transacionais.
Para especificar uma opção de gerenciamento de intervalo de identidade, consulte Gerenciar Colunas de Identidade.
Atribuindo intervalos de identidade
A replicação de mesclagem e a replicação transacional usam métodos diferentes para atribuir intervalos; esses métodos são descritos nesta seção.
Há dois tipos de intervalos para levar em conta ao replicar colunas de identidade: os intervalos atribuídos ao Publicador e assinantes e o intervalo do tipo de dados na coluna. A tabela a seguir mostra os intervalos disponíveis para os tipos de dados normalmente usados em colunas de identidade. O intervalo é usado em todos os nós dentro de uma topologia. Por exemplo, se você usar smallint a partir de 1 com um incremento de 1, o número máximo de inserções será 32.767 para o Publicador e todos os Assinantes. O número real de inserções depende se há lacunas nos valores usados e se um valor limite é usado. Para obter mais informações sobre limites, consulte as seguintes seções: "Replicação de Mesclagem" e "Replicação Transacional com Assinaturas de Atualização em fila".
Se o Publicador esgotar seu intervalo de identidade após uma inserção, ele poderá atribuir automaticamente um novo intervalo se a inserção tiver sido executada por um membro da função de banco de dados fixa db_owner. Se a inserção foi executada por um usuário que não está nessa função, o Agente de Leitor de Log, o Agente de Mesclagem ou um usuário que seja membro da função db_owner deverá executar sp_adjustpublisheridentityrange (Transact-SQL). Para publicações transacionais, o Agente de Leitor de Log deve estar em execução para alocar automaticamente um novo intervalo (o padrão é que o agente seja executado continuamente).
Aviso
Durante uma grande inserção em lote, o gatilho de replicação é acionado apenas uma vez, não para cada linha da inserção. Isso pode levar a uma falha na instrução de inserção se um intervalo de identidade estiver esgotado durante uma inserção grande, como uma instrução INSERT INTO .
| Tipo de dados | Alcance |
|---|---|
tinyint |
Não há suporte para gerenciamento automático |
smallint |
-2^15 (-32.768) a 2^15-1 (32.767) |
int |
-2^31 (-2.147.483.648) a 2^31-1 (2.147.483.647) |
bigint |
-2^63 (-9.223.372.036.854.775.808) a 2^63-1 (9.223.372.036.854.775.807) |
decimal e numeric |
-10^38+1 a 10^38-1 |
Observação
Para criar um número de incremento automático que possa ser usado em várias tabelas ou que possa ser chamado de aplicativos sem fazer referência a nenhuma tabela, consulte Números de Sequência.
Replicação de mesclagem
Os intervalos de identidade são gerenciados pelo Publicador e propagados para Assinantes pelo Merge Agent (em uma hierarquia de republicação, os intervalos são gerenciados pelo Publicador raiz e pelos republicadores). Os valores de identidade são atribuídos de um pool no Publicador. Ao adicionar um artigo com uma coluna de identidade a uma publicação no Assistente para Nova Publicação ou usando sp_addmergearticle (Transact-SQL), você especifica valores para:
O parâmetro @identity_range que controla o tamanho do intervalo de identidades inicialmente alocado ao Publicador e aos Assinantes com assinaturas de cliente.
Observação
Para assinantes executando versões anteriores do SQL Server, esse parâmetro (em vez do parâmetro @pub_identity_range) também controla o tamanho do intervalo de identidade em assinantes que estão republicando.
O parâmetro @pub_identity_range , que controla o tamanho do intervalo de identidade para republicar alocado aos Assinantes com assinaturas de servidor (necessário para republicar dados). Todos os subscriptores com assinaturas de servidor recebem um intervalo de tempo para republicação, mesmo sem republicarem dados.
O parâmetro @threshold , que é usado para determinar quando um novo intervalo de identidades é necessário para uma assinatura do SQL Server Compact ou uma versão anterior do SQL Server.
Por exemplo, você pode especificar 10000 para @identity_range e 500000 para @pub_identity_range. O Publicador e todos os Assinantes que executam o SQL Server 2005 ou uma versão posterior, incluindo o Assinante com a assinatura do servidor, recebem um intervalo primário de 10000. O Assinante com a assinatura do servidor também recebe um intervalo primário de 500000, que pode ser usado por Assinantes que sincronizam com o Assinante de republicação (você também deve especificar @identity_range, @pub_identity_range e @threshold para os artigos na publicação no Assinante de republicação).
Cada Assinante que executa o SQL Server 2005 ou uma versão posterior também recebe um intervalo de identidade secundário. O intervalo secundário é igual ao intervalo primário; quando o intervalo primário é esgotado, o intervalo secundário é usado e o Merge Agent atribui um novo intervalo ao Assinante. O novo intervalo se torna o intervalo secundário e o processo continua conforme o Assinante usa valores de identidade.
Replicação transacional com assinaturas de atualização em fila
Os intervalos de identidade são gerenciados pelo Distribuidor e propagados para Assinantes pelo Agente de Distribuição. Os valores de identidade são atribuídos a partir de um conjunto no Distribuidor. O tamanho do pool é baseado no tamanho do tipo de dados e no incremento usado para a coluna de identidade. Ao adicionar um artigo com uma coluna de identidade a uma publicação no Assistente para Nova Publicação ou usando sp_addarticle (Transact-SQL), você especifica valores para:
O parâmetro @identity_range , que controla o tamanho do intervalo de identidades alocado inicialmente para todos os Assinantes.
O parâmetro @pub_identity_range , que controla o tamanho do intervalo de identidade alocado ao Publicador.
O parâmetro @threshold , que é usado para determinar quando um novo intervalo de identidades é necessário para uma assinatura.
Por exemplo, você pode especificar 10.000 para @pub_identity_range, 1000 para @identity_range (supondo menos atualizações no Assinante) e 80% para @threshold. Após 800 inserções em um Assinante (80% de 1000), o Assinante recebe um novo intervalo de numeração. Após 8.000 inserções no editor, o editor recebe um novo intervalo de valores. Quando um novo intervalo for atribuído, haverá uma lacuna nos valores do intervalo de identidade na tabela. Especificar um limite mais alto resulta em lacunas menores, mas o sistema é menos tolerante a falhas: se o Agente de Distribuição não puder ser executado por algum motivo, um Assinante poderá ficar sem identidades com mais facilidade.
Atribuindo intervalos para o gerenciamento manual do intervalo de identidades
Se você especificar o gerenciamento manual do intervalo de identidades, deverá garantir que o Publicador e cada Assinante usem intervalos de identidade diferentes. Por exemplo, considere uma tabela no Publicador com uma coluna de identidade definida como IDENTITY(1,1): a coluna de identidade começa em 1 e é incrementada em 1 sempre que uma linha é inserida. Se a tabela no Publicador tiver 5.000 linhas e você esperar algum crescimento na tabela ao longo da vida útil do aplicativo, o Publicador poderá usar o intervalo de 1 a 10.000. Considerando dois Assinantes, o Assinante A poderia usar de 10.001 a 20.000, e o Assinante B poderia usar 20.001-30.000.
Depois que um Assinante for inicializado com um instantâneo ou por outro meio, execute DBCC CHECKIDENT para atribuir ao Assinante um ponto de partida para seu intervalo de identidade. Por exemplo, no Assinante A, você executaria DBCC CHECKIDENT('<TableName>','reseed',10001). No Assinante B, você executaria CHECKIDENT('<TableName>','reseed',20001).
Para atribuir novos intervalos ao Publicador ou assinantes, execute DBCC CHECKIDENT e especifique um novo valor para reencarnar a tabela. Você deve ter alguma maneira de determinar quando um novo intervalo deve ser atribuído. Por exemplo, seu aplicativo pode ter um mecanismo que detecta quando um nó está prestes a usar seu intervalo e atribuir um novo intervalo usando DBCC CHECKIDENT. Você também pode adicionar uma restrição de verificação para garantir que uma linha não possa ser adicionada se ela fizer com que um valor de identidade fora do intervalo seja usado.
Manipulando intervalos de identidade após uma restauração de banco de dados
Se você estiver usando o gerenciamento automático do intervalo de identidades, quando um Assinante for restaurado de um backup, ele solicitará automaticamente um novo intervalo de valores de identidade. Se um Publicador for restaurado de um backup, você deverá garantir que o Publicador tenha um intervalo apropriado. Para replicação de mesclagem, atribua um novo intervalo usando sp_restoremergeidentityrange (Transact-SQL). Para replicação transacional, determine o valor mais alto que foi usado e defina o ponto de partida para novos intervalos. Use o seguinte procedimento após a restauração do banco de dados de publicação:
Interrompa todas as atividades em todos os Assinantes.
Para cada tabela publicada que inclui uma coluna de identidade:
No banco de dados de assinatura de cada assinante, execute
IDENT_CURRENT('<TableName>').Registre o valor mais alto encontrado entre todos os Assinantes.
No banco de dados de publicação do Publisher, execute
DBCC CHECKIDENT(<TableName>','reseed',<HighestValueFound+1>).No banco de dados de publicação no Publicador, execute
sp_adjustpublisheridentityrange <PublicationName>, <TableName>.
Observação
Se o valor na coluna de identidade estiver definido como decrementar em vez de incrementar, registre o valor mais baixo encontrado e, em seguida, ressoe com esse valor.
Consulte Também
BACKUP (Transact-SQL)
DBCC CHECKIDENT (Transact-SQL)
IDENT_CURRENT (Transact-SQL)
IDENTITY (propriedade) (Transact-SQL)
sp_adjustpublisheridentityrange (Transact-SQL)