FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Update de campos clave, tablas relacionadas
Tengo dos tablas, la primera con campo clave CA1, la segunda con un campo CA2 que enlace con la primera tabla con una restricción de integridad referencial.
Como puedo modificar un valor en el campo CA1 mientras hay entradas en la segunda tabla con el mismo valor que el registro de la primera tabla? Pensé en crear una nueva entrada en la primera tabla con clave el nuevo valor que debe tener. Despues, modificar las entradas de la segunda tabla para "apuntar" al registro nuevo, para a continuación eliminar el registro inicial de la primera tabla. Problema clasico de actualización de la clave de una tabla maestra !!!! Como puedo hacer esto de forma más elegante, quizas desactivando la restricción de integridad referencial temporalmente, o usando SET CONSTRAINT XXX DEFERRED, o que ?? Trabajamos con Oracle, PL/SQL, V9.2.0.4. |
#2
|
|||
|
|||
No he trabajado nunca con Oracle, pero me imagino que tendrá actualizaciones en cascada por lo que, cambiando el código en la tabla maestra, se cambiará automáticamente en la tabla detalle (si, como dices, has definido una relación de integridad entre ambas)
|
#3
|
|||
|
|||
Para mas detalle, si es como en Interbase, al declarar la Foreign Key, puedes decirle como reaccionar ante determinados enventos, ej.
Código:
ALTER TABLE ARTICULO ADD CONSTRAINT FK_ARTICULO_FAMILIA FOREIGN KEY (FAMILIA) REFERENCES FAMILIA (CODIGO) ON UPDATE CASCADE ON DELETE NO ACTION; Un saludo.
__________________
J. Adolfo Núñez |
#4
|
|||
|
|||
As far as I know, Oracle has no ON UPDATE CASCADE clause, hence my question -- how to proceed when there is no such clause.
|
#5
|
|||
|
|||
Oracle has no ON UPDATE CASCADE clause, as far as I know -- hence my question: how to proceed when there is no such clause.
|
#6
|
|||
|
|||
El codigo que yo he puesto es para IB, quizas el formato para Oracle sea distinto. En la ayuda de la creacion de FK debe aparecer algo. Si no lo permitiera, podrias deshabilitar la regla de integridad, realizar los cambios en las dos tablas y volver a habilitar la regla de integridad. Digo deshabilitar y habilitar, no eliminar y volver a crear.
Esto se que se puede hacer en Oracle, porque lo hice en unas practcas de la carrera pero no recuerdo como.
__________________
J. Adolfo Núñez |
#7
|
|||
|
|||
Otra opción sería crear triggers que te hicieran el proceso del Update Cascade (que de echo, es lo que se monta internamente)
|
#8
|
|||
|
|||
La opción de deshabilitar la restricción de integridad referencial no es posible, porque haría falta dar al usuario el privilegio ALTER TABLE, cosa que no queremos -- es demasiado comprometido.
Por otra parte, perdoname el lapsus al contestar en Inglés esta mañana -- fue involuntario. Jim Fleming |
#9
|
|||
|
|||
Bueno, pues mi ideas se van acabando.
Una cosa mas. Imagina por un momento, que el usuario puede ejecutar un procedimiento almacenado, el cual, se puediera auntifica como usuario con el privilegio Alter Table, aunque el usuario que lanzo el procedimiento no tenga dicho privilegio. Si esto fuera posible, con poner en el procedemiento almacenado, el codigo necesario para deshabilitar la FK, realizar los cambios y volver a habilitar la restricción estaría hecho. Ya digo que no se si esto es posible. Un saludo
__________________
J. Adolfo Núñez |
#10
|
|||
|
|||
De hecho, las modificaciones de la base de datos se hacen desde un procedimiento almacenado, pero con los privilegios del usuario normal, no con los de un usuario confiado ni los del administrador del sistema.
Se puede realizar una operación de mayor privilegio desde un SP que ha sido llamado por un usuario de menor nivel de privilegio ??? Como ??? Jim Fleming |
#11
|
|||
|
|||
Eso ya no se si es posible en Oracle, tendras que mirar en la documentacion. Simplemente era una idea, no se si se podra llevar a cabo.
__________________
J. Adolfo Núñez |
|
|
|