Pergunta

O aplicativo usa banco de dados de um Oracle 10g, onde várias chaves primárias estão expostos para o usuário final. Productcodes e tal. Infelizmente, é tarde demais para fazer qualquer coisa com isso, como há toneladas de relatórios e scripts personalizados lá fora, que não tem controle. Não podemos redefinir as chaves primárias ou atrapalhar a estrutura de banco de dados.

Agora algum cliente deseja alterar alguns dos valores de chave primária. O que inicialmente queria P23A1 chamada deve agora ser chamado CAT23MOD1 (não um exemplo real, mas você me entende.)

Existe uma maneira fácil de fazer isso? Eu preferiria um script de algum tipo, que pode ser parametrizada para caber outras tabelas e chaves, mas ferramentas externas seria aceitável se nenhuma outra maneira existe.

Foi útil?

Solução

O problema é provavelmente com as chaves estrangeiras que fazem referência ao PK. Você deve definir as chaves estrangeiras como "deferrable inicialmente imediata", conforme descrito neste artigo Tom Kyte: http://www.oracle.com/technology/oramag/oracle/03-nov/o63asktom.html Isso permite que você ...

  1. Adiar as restrições
  2. Modificar o valor pai
  3. Modifique os valores criança
  4. confirmar a alteração

Simples.

Outras dicas

Opa. Um pouco googling faz parecer que, inexplicavelmente, a Oracle não implementa ON UPDATE CASCADE, única CASCADE ON DELETE. Para encontrar soluções google ORACLE ON UPDATE CASCADE. Aqui está um link em Criando Uma Actualização em cascata conjunto de tabelas em Oracle.

resposta Original:

Se bem entendi, você quer mudar as valores de dados em colunas de chave primária, e não os nomes de restrição reais das próprias chaves.

Se isso for verdade, pode mais facilmente ser realizado redefinindo todas as chaves estrangeiras que fazem referência a restrição de chave primária afetada como ON UPDATE CASCADE. Isto significa que quando você faz uma alteração para o valor da chave primária, o motor irá atualizar automaticamente todos os valores relacionados em tabelas de chaves estrangeiras.

Esteja ciente de que, se isso resulta em uma série de mudanças poderia ser proibitivamente caro em um sistema de produção.

Se você tem que fazer isso em um sistema vivo sem DDL muda para as tabelas envolvidas, então eu acho que sua única opção é (para cada valor da PK que precisa ser mudado):

  1. Inserir na tabela pai uma cópia da linha com o valor PK substituído
  2. Para cada tabela filho, atualizar o valor FK para o novo valor PK
  3. Excluir a linha da tabela pai com o valor PK velho

Se você tem uma lista de tabelas pai e os valores PK a ser renomeado, ele não deve ser muito difícil de escrever um procedimento que faz isso - a informação em USER_CONSTRAINTS pode ser usado para obter as tabelas FK-relacionados para um dada tabela pai.

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