Pergunta

Existe uma maneira de mesclar duas chaves primárias em uma e, em seguida, atualizar em cascata todos os relacionamentos afetados? Aqui está o cenário:

Clientes (Idcustomer int PK, Empresa Varchar (50), etc)

CustomerContacts (IDCUSTOMERCONTACT INT PK, IDCUSTOMER INT FK, NOME VARCHO (50), ETC)

CustomerNotes (Idcustomernote int pk, idcustomer int fk, nota de nota, etc)

Às vezes, os clientes precisam ser mesclados em um. Por exemplo, você tem um cliente com o ID de 1 e outro com o ID de 2. Você deseja mesclar os dois, para que tudo o que era 2 agora. Primeiro, mas eu gostaria de torná -lo mais provas futuras usando as regras da Cascade, para que não precise atualizar o script toda vez que há um novo relacionamento adicionado.

Alguma ideia?

Foi útil?

Solução

Não existe uma maneira automática de fazê-lo, mas você tem algumas opções, pode escrever manualmente os procedimentos ou pode gerar o código regularmente ou gerá-lo dinamicamente em tempo de execução. Para fazer isso, você pode usar o INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS e INFORMATION_SCHEMA.KEY_COLUMN_USAGE e INFORMATION_SCHEMA.TABLE_CONSTRAINTS e INFORMATION_SCHEMA.COLUMNS and INFORMATION_SCHEMA.TABLES Para construir o procedimento dinamicamente.

Você também pode simplesmente envolver toda a operação em uma transação (uma boa idéia de qualquer maneira). A última etapa será remover o cliente que está sendo mesclado; portanto, se houver RI em uma mesa que você nunca adicionou e você tentar fazer uma mesclagem, ela falhará porque você não pode remover o cliente que está sendo mesclado, pois há dependentes Registros em uma tabela que já não foi adicionada ao procedimento de mesclagem.

Outras dicas

Considere usar gatilhos em vez disso. Na atualização dos clientes (coluna Idcustomer), você faz as modificações necessárias (excluir, atualizar ...) nas tabelas relacionadas.

Parece que você acabará com dois discos para cada uma dessas tabelas que têm a mesma chave primária. Esta é sua intenção?

        Clientes
    idCustomer Company
         1     AT&T
         2     Cingular

Depois que a fusão se tornará

        Clientes
    idCustomer Company
         1     AT&T
         1     Cingular

De qualquer forma, a solução de prova mais futura seria escrever um procedimento. Você pode passar no procedimento dos clientes e ele faria todo o trabalho de atualizar todas as tabelas conforme necessário.

Alguma solução mais recente para isso?

Eu tenho o mesmo problema e, no momento, construir os procedimentos dinamicamente parecem muito complicados. Veja como isso poderia funcionar em teoria, mas acho que não?

Em uma transação: 1) Desativar temporariamente a restrição de chave primária aos clientes 2) Atualize o ID primário do cingular para '1', que tem uma regra em cascata de atualização de relacionamento cuidando das crianças 3) Use um campo de chave secundária para excluir (somente) CINGULAR 4 ) Ativar restrições de chave primária aos clientes

Ansioso por algo assim no futuro T-SQL:

Exclua com atualização idcustomer = 1 de clientes onde idcustomer = 2;

;-)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top