Question

Notre application utilise une base de données Oracle 10g où plusieurs clés primaires sont exposées à l'utilisateur final. Productcodes et autres. Malheureusement, il est trop tard pour faire quoi que ce soit avec cela, car il y a des tonnes de rapports et des scripts personnalisés là-bas que nous n'avons pas le contrôle. Nous ne pouvons pas redéfinir les clés primaires ou désordre de la structure de base de données.

Maintenant, certains clients veulent changer certaines des valeurs de clé primaire. Ce qu'ils voulaient d'abord appeler P23A1 devrait maintenant être appelé CAT23MOD1 (pas un exemple réel, mais vous obtenez mon sens.)

Y at-il un moyen facile de le faire? Je préfère un script de quelque sorte, qui pourrait être paramétrés pour tenir d'autres tables et les clés, mais les outils externes serait acceptable si aucun autre moyen existe.

Était-ce utile?

La solution

Le problème est probablement avec les clés étrangères qui font référence au PK. Vous devez définir les clés étrangères comme « reportables d'abord immédiate », comme décrit dans cet article Tom Kyte: http://www.oracle.com/technology/oramag/oracle/03-nov/o63asktom.html Cela vous permet de ...

  1. Différer les contraintes
  2. Modifier la valeur parent
  3. Modifier les valeurs de l'enfant
  4. Engagez le changement

Simple.

Autres conseils

Oops. Un peu googler fait apparaître que, inexplicablement, Oracle ne met pas en oeuvre ON UPDATE CASCADE, uniquement sur SUPPRIMER CASCADE. Pour des solutions de contournement google ON UPDATE CASCADE ORACLE. Voici un lien sur Création d'une mise à jour en cascade série de tableaux dans Oracle.

Réponse originale:

Si je comprends bien, vous voulez changer les valeurs de données dans les colonnes de clé primaire, et non pas les noms de contraintes réelles des touches elles-mêmes.

Si cela est vrai, il peut plus facilement se faire redéfinir toutes les clés étrangères qui font référence à la contrainte de clé primaire affectée comme ON UPDATE CASCADE. Cela signifie que lorsque vous modifiez la valeur de clé primaire, le moteur se mettra à jour automatiquement toutes les valeurs connexes dans les tableaux clés étrangères.

Sachez que si cela se traduit par beaucoup de changements, il pourrait être prohibitif dans un système de production.

Si vous devez le faire sur un système en temps réel avec aucun changement aux tables DDL en jeu, alors je pense que votre seule option est de (pour chaque valeur du PK qui doit être changé):

  1. Insérer dans la table parent une copie de la ligne avec la valeur de PK remplacé
  2. Pour chaque table enfant, mettez à jour la valeur FK à la nouvelle valeur PK
  3. Supprimer la ligne de table parent avec l'ancienne valeur PK

Si vous avez une liste de tables parent et les valeurs de PK à renommer, il ne devrait pas être trop difficile d'écrire une procédure qui fait cela - les informations contenues dans USER_CONSTRAINTS peut être utilisé pour obtenir les tableaux liés FK-pour une table parent donné.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top