Ordenar chave primária Identity de uma tabela que fornece chave estrangeira.

21/12/2015

0

Bom dia, pessoal.
Sou novo aqui no fórum (pelo menos como cadastrado haha), e estou com um probleminha em meu trabalho. Preciso organizar a chave primária de uma tabela "Família", onde seu Identity foi "desregulado" devido a um bug em uma unidade que usava o SQL Server 2014 e acabou realizando algumas inserções nesta tabela, com mais de 1000 números a frente. Consegui resolver este problema, para que o mesmo não volte a acontecer, porém, é de suma importância que eu consiga ordenar os registros que já pularam a sequência, mas estou tendo dificuldades, pois ao mesmo tempo a chave primária COD_FAMILIA é identity e fornece a mesma como chave estrangeira para mais 5 tabelas.

A minha pergunta é: Como posso ordenar isso?

Obrigado.
Att,
Vitor Alfeu Eliotério
Vitor Eliotério

Vitor Eliotério

Responder

Post mais votado

21/12/2015

Você pode ajustar isso, de maneira bastante simples...

Considerando que a diferença numérica na faixa de identities é 997 ( 10890 - 9893 ), siga os seguintes passos :

1. Coloque o banco em modo exclusivo de uso
2. Na tabela com a PK :
   > desabilite o IDENTIY ( SET IDENTITY OFF ) >
   > desabilite outras CONSTRAINTS associadas
   > atualize ( via update ) a campo coluna com a PK atual menos o offset ( 997 ) 
   > habilite as CONSTRAINTS 
   > habilite o IDENTITY ( SET IDENTITY ON )
3. Nas tabelas com as FKS, repita o processo de modo a aplicar o mesmo update ( subtraindo o offset de 997 )
4. Libere o banco para acesso compartilhado


Entendeu a ideia ?

ATENÇÃO : Embora simples, esse procedimento deve ser realizado com extremo cuidado, pois a quebra na integridade das FKs pode comprometer TODO o relacionamento de dados. Portanto, teste isso em ambiente separado, antes de aplicar o ajuste em produção.

Marcos P

Marcos P
Responder

Mais Posts

21/12/2015

Jothaz

Posta a estrutura das tabelas.

Para facilitar a ajudar crie um massa de teste em http://sqlfiddle.com/
Responder

21/12/2015

Marcos P

Vitor,

Não entendi muito bem seu problema... o que significa exatamente "desregulado" ?

Você perdeu a ligação das chaves primárias com as chaves estrangeiras ou, simplesmente, teve problemas de sequencia na chave primária ( mas a ligação com as FKs está íntegra ) ?

Consegue colocar um exemplo, para entendermos melhor sua necessidade ?
Responder

21/12/2015

Vitor Eliotério

@Marcos P: Simplesmente tive problemas de sequência no identity, e agr preciso organizar cada registro e ao mesmo tempo organizá-los nas tabelas que o usam também.
OBS: Eu precisaria resolver esse problema em um script, pois fui orientado a resolver esse problema da forma mais dinâmica possível, para desenvolver um sisteminha em delphi, para resolver futuros problemas como este.

Como por exemplo na imagem abaixo, o identity pulou vários números.

[img:descricao=Consulta da Tabela família, mostrando o momento em que o identity pula]http://arquivo.devmedia.com.br/forum/imagem/468305-20151221-114620.jpg[/img]
[img:descricao=Tabelas que usam o Código da Família como FK]http://arquivo.devmedia.com.br/forum/imagem/468305-20151221-113857.jpg[/img]
Responder

21/12/2015

Vitor Eliotério

Muito obrigado, Marcos.
Vou dar uma estudada melhor na parte do comando offset, pois não o conheço. Entretanto, passo por um outro problema, vc poderia me ajudar a descobrir, em uma consulta, quando ocorre desses intervalos pularem +100 valores na chave primária?

Por exemplo, existem várias ocasiões que ocasionou-se isso neste banco e não há um padrão de saltos, pois neste momento pula-se 997, em outro momento pula-se 1003 e assim vai...
Responder

21/12/2015

Jothaz

Só um complemento e talvez até desnecessário, não se esqueça de fazer um backup ou até dois. kk
Responder

21/12/2015

Marcos P

Offset ( deslocar, em inglês ) não é um comando... é um conceito !

Justamente a diferença que você precisa ajustar, por conta desses "saltos" em sua sequencia.

Quanto a um mecanismo dinâmico que faça isso é outra questão bastante simples de implementar.

Faça um cursor que recupere ( de maneira ordenada ) toda a sequencia de chaves em sua PK.

Dentro de um loop implemente um contador sequencial de registros.

Sempre que o valor do contador sequencial for diferente do próximo registro da PK obtido no cursor, você tem um registro com diferença e pode aplicar a lógica que descrevi antes.

Você pode fazer esse controle todo, diretamente do lado do Sql Server ( pesquise sobre CURSOR e WHILE ).

Além de testar em ambiente separado, não esqueça, também, da recomendação do Jothaz... backup ( sempre ) !!!
Responder

28/12/2015

Marcos P

Conseguiu resolver ?
Responder

30/12/2015

Vitor Eliotério

Consegui sim, porém não fiquei no SQL puro, utilizei alguns recursos da IDE que estou usando para me ajudar na manipulação de querys, mas no final deu certo. Obrigadão pela ajuda de vcs!!
Responder

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar