Pregunta

Nuestra aplicación utiliza una base de datos Oracle 10g, donde varias claves primarias están expuestos al usuario final. ProductCodes y tal. Por desgracia, es demasiado tarde para hacer nada con esto, ya que hay un montón de informes y scripts personalizados por ahí que no tenemos control sobre. No podemos redefinir las claves primarias o fastidiarla con la estructura de base de datos.

Ahora algún cliente quiere cambiar algunos de los valores de clave principal. Lo que inicialmente quisieron llamar P23A1 ahora debería llamarse CAT23MOD1 (no es un ejemplo real, pero lo que quiero decir.)

¿Hay una manera fácil de hacer esto? Yo preferiría un guión de algún tipo, que podrían ser parametrizada para adaptarse a otras tablas y claves, pero las herramientas externas sería aceptable si no existe otra manera.

¿Fue útil?

Solución

El problema es presumiblemente con las claves externas que hacen referencia al PK. Debe definir las claves externas como "diferible inicialmente inmediata", tal como se describe en este artículo Tom Kyte: http://www.oracle.com/technology/oramag/oracle/03-nov/o63asktom.html Que le permite ...

  1. Aplazar las limitaciones
  2. Modificar el valor de los padres
  3. Modificar los valores de los niños
  4. confirmar el cambio

simple.

Otros consejos

Vaya. Un poco de googling hace que parezca que, inexplicablemente, Oracle no implementa ON UPDATE CASCADE, solamente ON DELETE CASCADE. para encontrar soluciones alternativas de google ORACLE ON UPDATE CASCADE. Aquí hay un enlace en Creación de una cascada conjunto de actualización de tablas en Oracle.

Respuesta original:

Si he entendido bien, desea cambiar los valores de de datos de las columnas de clave principal, no los nombres de restricción reales de las teclas de sí mismos.

Si esto es cierto, puede ser más fácil de realizar la redefinición de TODAS las claves externas que hacen referencia a la afectada restricción de clave primaria como ON UPDATE CASCADE. Esto significa que cuando se realiza un cambio en el valor de la clave primaria, el motor se actualizará automáticamente todos los valores relacionados en las tablas de claves foráneas.

Tenga en cuenta que si esto se traduce en una gran cantidad de cambios que podría ser prohibitivo en un sistema de producción.

Si usted tiene que hacer esto en un sistema vivo sin cambios DDL para las tablas involucradas, entonces creo que su única opción es (para cada valor de la PK que necesita ser cambiado):

  1. Inserte en la tabla padre una copia de la fila con el valor PK reemplazado
  2. Para cada tabla secundaria, actualizar el valor FK al nuevo valor PK
  3. Borrar la fila de la tabla padre con el valor de PK de edad

Si usted tiene una lista de tablas padre y los valores de PK que cambiar el nombre, no debería ser demasiado difícil de escribir un procedimiento que hace esto - la información en USER_CONSTRAINTS puede ser utilizado para obtener las tablas relacionadas con el FK para una tabla primaria dada.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top