Array
(
    [0] => stdClass Object
        (
            [Votos_Balanceados] => 2
            [id] => 540461
            [titulo] => Ordenar chave primária Identity de uma tabela que fornece chave estrangeira.
            [dataCadastro] => DateTime Object
                (
                    [date] => 2015-12-21 11:56:57
                    [timezone_type] => 3
                    [timezone] => America/Sao_Paulo
                )

            [isFirstPost] => -1
            [idUsuario] => 378439
            [status] => A
            [isExample] => 
            [NomeUsuario] => Marcos P
            [Apelido] => 
            [Foto] => 378439_20140801115452.png
            [Conteudo] => 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 :

[code]
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
[/code]

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. ) )

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

Vitor Alfeu
   - 21 dez 2015

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

Post mais votado

Marcos P
   - 21 dez 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 :

#Código

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.

Jothaz
   - 21 dez 2015

Posta a estrutura das tabelas.

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

Marcos P
   - 21 dez 2015

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 ?

Vitor Alfeu
   - 21 dez 2015

@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.

Consulta da Tabela família, mostrando o momento em que o identity pula (Clique na imagem para abrir em uma nova janela)
Tabelas que usam o Código da Família como FK (Clique na imagem para abrir em uma nova janela)

Vitor Alfeu
   - 21 dez 2015

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...

Jothaz
   - 21 dez 2015

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

Marcos P
   - 21 dez 2015

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 ) !!!

Marcos P
   - 28 dez 2015

Conseguiu resolver ?

Vitor Alfeu
   - 30 dez 2015

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!!