Domanda

La nostra applicazione utilizza un database Oracle 10g dove diverse chiavi primarie sono esposti per l'utente finale. Productcodes e tali. Purtroppo è troppo tardi per fare qualcosa con questo, come ci sono tonnellate di report e script personalizzati là fuori che non abbiamo il controllo su. Non possiamo ridefinire le chiavi primarie o rovinare lo struttura del database.

Ora qualche cliente vuole cambiare alcuni dei valori chiave primaria. Quello che inizialmente volevano chiamare P23A1 dovrebbe ora essere chiamato CAT23MOD1 (non un vero e proprio esempio, ma si ottiene il mio significato.)

C'è un modo semplice per fare questo? Io preferirei uno script di qualche tipo, che potrebbero essere parametrizzato per adattarsi altri tavoli e le chiavi, ma strumenti esterni sarebbe accettabile se non esiste alcun altro modo.

È stato utile?

Soluzione

Il problema è presumibilmente con le chiavi esterne che fanno riferimento PK. È necessario definire le chiavi esterne come "differibile inizialmente immediata", come descritto in questo articolo di Tom Kyte: http://www.oracle.com/technology/oramag/oracle/03-nov/o63asktom.html Che consente di ...

  1. rinviare le costrizioni
  2. Modificare il valore padre
  3. modificare i valori bambino
  4. commit della modifica

Semplice.

Altri suggerimenti

Spiacenti. Un po 'googling fa sembrare che, inspiegabilmente, Oracle non implementa ON UPDATE CASCADE, solo ON DELETE CASCADE. per trovare soluzioni alternative google ORACLE ON UPDATE CASCADE. Ecco un link su Creazione di un Aggiornare Imposta Cascata delle tabelle in Oracle.

Risposta originale:

Se ho capito bene, si desidera modificare i valori di di dati in colonne chiave primaria, non i nomi dei vincoli reali dei tasti stessi.

Se questo è vero che può essere più facilmente realizzata ridefinire tutte le chiavi esterne che fanno riferimento al vincolo di chiave primaria interessata come ON UPDATE CASCADE. Ciò significa che quando si apporta una modifica al valore della chiave primaria, il motore si aggiorna automaticamente tutti i valori relativi a tabelle di chiave esterna.

Si noti che se questo si traduce in un sacco di cambiamenti potrebbe essere proibitivo in un sistema di produzione.

Se dovete fare questo su un sistema live senza modifiche DDL per le tabelle coinvolte, allora penso che l'unica opzione è quella di (per ogni valore della PK che ha bisogno di essere cambiato):

  1. Inserire nella tabella padre una copia della riga con il valore PK sostituito
  2. Per ogni tabella figlio, aggiornare il valore FK al nuovo valore PK
  3. Elimina la riga della tabella genitore con il vecchio valore PK

Se si dispone di un elenco di tabelle padre ei valori PK da rinominare, non dovrebbe essere troppo difficile da scrivere una procedura che fa questo - le informazioni in user_constraints può essere utilizzato per ottenere le tabelle FK-correlati per un data tabella padre.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top