Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 25-02-2004
jfleming jfleming is offline
Registrado
 
Registrado: feb 2004
Posts: 5
Poder: 0
jfleming Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 25-02-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
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)
Responder Con Cita
  #3  
Antiguo 26-02-2004
murci murci is offline
Miembro
 
Registrado: jul 2003
Ubicación: Murcia
Posts: 43
Poder: 0
murci Va por buen camino
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.
__________________
J. Adolfo Núñez
Responder Con Cita
  #4  
Antiguo 26-02-2004
jfleming jfleming is offline
Registrado
 
Registrado: feb 2004
Posts: 5
Poder: 0
jfleming Va por buen camino
As far as I know, Oracle has no ON UPDATE CASCADE clause, hence my question -- how to proceed when there is no such clause.
Responder Con Cita
  #5  
Antiguo 26-02-2004
jfleming jfleming is offline
Registrado
 
Registrado: feb 2004
Posts: 5
Poder: 0
jfleming Va por buen camino
Oracle has no ON UPDATE CASCADE clause, as far as I know -- hence my question: how to proceed when there is no such clause.
Responder Con Cita
  #6  
Antiguo 26-02-2004
murci murci is offline
Miembro
 
Registrado: jul 2003
Ubicación: Murcia
Posts: 43
Poder: 0
murci Va por buen camino
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
Responder Con Cita
  #7  
Antiguo 26-02-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
Otra opción sería crear triggers que te hicieran el proceso del Update Cascade (que de echo, es lo que se monta internamente)
Responder Con Cita
  #8  
Antiguo 26-02-2004
jfleming jfleming is offline
Registrado
 
Registrado: feb 2004
Posts: 5
Poder: 0
jfleming Va por buen camino
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
Responder Con Cita
  #9  
Antiguo 26-02-2004
murci murci is offline
Miembro
 
Registrado: jul 2003
Ubicación: Murcia
Posts: 43
Poder: 0
murci Va por buen camino
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
Responder Con Cita
  #10  
Antiguo 26-02-2004
jfleming jfleming is offline
Registrado
 
Registrado: feb 2004
Posts: 5
Poder: 0
jfleming Va por buen camino
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
Responder Con Cita
  #11  
Antiguo 26-02-2004
murci murci is offline
Miembro
 
Registrado: jul 2003
Ubicación: Murcia
Posts: 43
Poder: 0
murci Va por buen camino
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
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 02:34:24.


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
Copyright 1996-2007 Club Delphi