Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Update de campos clave, tablas relacionadas (https://www.clubdelphi.com/foros/showthread.php?t=7752)

jfleming 25-02-2004 19:40:12

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.

__cadetill 25-02-2004 20:04:03

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)

murci 26-02-2004 09:37:52

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;

Como dice cadetill, on update cascade, modificaria tambien el registro en la tabla detalle. El no action del on delete, significa que va a rechazar la accion si hay referencias en la tabla detalle.

Un saludo.

jfleming 26-02-2004 10:12:21

As far as I know, Oracle has no ON UPDATE CASCADE clause, hence my question -- how to proceed when there is no such clause.

jfleming 26-02-2004 10:13:59

Oracle has no ON UPDATE CASCADE clause, as far as I know -- hence my question: how to proceed when there is no such clause.

murci 26-02-2004 10:32:09

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.

__cadetill 26-02-2004 10:38:43

Otra opción sería crear triggers que te hicieran el proceso del Update Cascade (que de echo, es lo que se monta internamente)

jfleming 26-02-2004 14:42:48

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

murci 26-02-2004 16:04:53

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

jfleming 26-02-2004 16:38:39

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

murci 26-02-2004 16:55: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.


La franja horaria es GMT +2. Ahora son las 00:39:36.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi