Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 25-04-2007
arrayman arrayman is offline
Miembro
 
Registrado: abr 2006
Posts: 55
Poder: 18
arrayman Va por buen camino
onupdate cascade con triger

Hola a tod@s, os comento un problemilla a ver si alguien ducho en sql (firebird 1.5) se le ocurre la solucion o me indica si es que hago algo mal gracias por adelantado y al grano.

os muestro en 1er lugar el codigo de un triger

CREATE OR ALTER TRIGGER TR_COMPLETA_RANGOS FOR GPACEDADES
ACTIVE AFTER INSERT OR UPDATE POSITION 0
AS
declare variable cod Integer;
begin
FOR select ncaracteristica FROM caracteristicas
WHERE ncaracteristica not in (select ncaracteristica from VALXCARAC
where NGRUPACIENTE = NEW.NGRUPACIENTE AND FROM_EDAD = NEW.FROM_EDAD
) INTO :cod
DO
BEGIN
insert into VALXCARAC (nGRUPACIENTE,FROM_EDAD, ncaracteristica, VMAX, VMIN, ALERTA)
values (NEW.NGRUPACIENTE, NEW.FROM_EDAD, :cod, 0, 0, '1');
END
end

por otro lado al modificar el campo From_Edad el cambio se propaga a la tabla valxcarac (como debe ser)

el objetivo es que el triger inserte un registro por caracteristica para un determinado rango de edad y de hecho lo hace el problema esta cuando actrualizo el campo from_edad al parecer el for select recupera tantos registros como caracteristicas haya, supongo que los cambios todavia no se han propagado (no lo se soy novato en esto de sql) el hecho es que las dos cosas (el update cascade y el triger) funcionan por separado pero las modificaciones fallan si activo el triger (Database Server Error: violation of PRIMARY or UNIQUE KEY constraint "PK_VALXCARAC" on table "VALXCARAC")

no se si en el for select usar old.from_edad en lugar de new.from_edad la verdad no me parece fiable aunque funcionase

gracias de nuevo.
Responder Con Cita
  #2  
Antiguo 26-04-2007
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
Código SQL [-]
insert into VALXCARAC (nGRUPACIENTE,FROM_EDAD, ncaracteristica, VMAX, VMIN, ALERTA)
values (NEW.NGRUPACIENTE, NEW.FROM_EDAD, :cod, 0, 0, '1');

El problema parece claro, estás intentando meter registros en la tabla VALXCARAC con los valores de primary key duplicados. Revisa cuales son los campos que definen la primary key de esta tabla, para comprobar que no introduces registros con éstos repetidos. Como sean nGRUPACIENTE y FROM_EDAD, ya puedes cambiarlos o añadir otro, ya que cada registro que insertas lo haces con los mismos valores.

Suerte y un saludo
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #3  
Antiguo 26-04-2007
arrayman arrayman is offline
Miembro
 
Registrado: abr 2006
Posts: 55
Poder: 18
arrayman Va por buen camino
Muchas gracias por responder fjcg02 es la primera vez que hago una consulta y ya me estaba impacientando, es cierto que el problema es que hay un intento de duplicación de claves pero lo que no se es exactamente por que, me explico : el triger es after upeate after insert , solo falla el after update tal como yo lo veo sucede asi, modifico un registro de la tabla A que proboca que
que salte el triger aqui el cambio ya esta echo pero al parecer la tabla detalle digamos B todavia no ha recibido las modificaciones que el on update cascade debe realizar por lo que el for select recupera informacion que no deberia, inserta datos que luego cuando los cambios del update cascade van a aplicarse se encuentra con que chocan con los introducidos por el triger no se si me explico, pero claro ¿entonces como lo hago? a caso no se puede modificar la tabla detalle delsde un triger de la maestra cuando se utiliza el on update cascade;
Responder Con Cita
  #4  
Antiguo 26-04-2007
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
Tengo dudas del update cascade. Si se aplica, no necesitarías hacer el trigger, ya que sería redundante.
Por otro lado - no estoy totalmente seguro - creo que no se puede cambiar el valor de un campo que forma parte de una primary key. Tendrías que borrar los registros y volverlos a insertar.

Haz alguna prueba y nos comentas el resultado.

Suerte y un saludo
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #5  
Antiguo 27-04-2007
arrayman arrayman is offline
Miembro
 
Registrado: abr 2006
Posts: 55
Poder: 18
arrayman Va por buen camino
Muchas gracias fjcg02, por tu ayuda, la unica prueba adicional que he hecho es cambiar el triger a la tabla detalle pero el problema es el mismo las inserciones al pelo pero aun siendo after update (se supone que los cambios ya estan hechos ) casca en realidad la tarea del triger es agregar los que faltan que en el insert son todos y en el update no deberian serlo pero es asi, supongo que las cosas no ocurren como yo pienso en realidad. no tengo demasiado tiempo pero cuando lo retome ya comentaré algo
gracias de nuevo
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Modo Cascade CoCaInE OOP 2 05-09-2006 17:06:13
On Delete Cascade ¿? marceloalegre SQL 3 30-05-2005 17:08:18


La franja horaria es GMT +2. Ahora son las 03:09:40.


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