Fórum Ordenar chave primária Identity de uma tabela que fornece chave estrangeira. #540451
21/12/2015
0
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
Curtir tópico
+ 0Post mais votado
21/12/2015
Considerando que a diferença numérica na faixa de identities é 997 ( 10890 - 9893 ), siga os seguintes passos :
1 2 3 4 5 6 7 8 9 | 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

Gostei + 2
Mais Posts
21/12/2015
Jothaz
Para facilitar a ajudar crie um massa de teste em http://sqlfiddle.com/
Gostei + 0
21/12/2015
Marcos P
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 ?
Gostei + 0
21/12/2015
Vitor Eliotério
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]
Gostei + 0
21/12/2015
Vitor Eliotério
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...
Gostei + 0
21/12/2015
Jothaz
Gostei + 0
21/12/2015
Marcos P
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 ) !!!
Gostei + 1
28/12/2015
Marcos P
Gostei + 0
30/12/2015
Vitor Eliotério
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)