Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

Trigger/Disparador: borrar en cascada

Estas en el tema de Trigger/Disparador: borrar en cascada en el foro de Bases de Datos General en Foros del Web. Hola! Veréis estoy haciendo una aplicación en VB net + SQLite. El caso es que quiero crear un trigger para que cuando borre un cliente ...
  #1 (permalink)  
Antiguo 25/02/2010, 10:15
 
Fecha de Ingreso: febrero-2010
Mensajes: 63
Antigüedad: 14 años, 2 meses
Puntos: 0
Trigger/Disparador: borrar en cascada

Hola!

Veréis estoy haciendo una aplicación en VB net + SQLite. El caso es que quiero crear un trigger para que cuando borre un cliente dese mi programa me borre en una tabla MEDIDAS todas las medidas asociadas a ese cliente, para lo cual estoy pensando en un trigger.

El trigger que he hecho es el siguiente:

Código SQL:
Ver original
  1. CREATE TRIGGER BorrarMedidas
  2. BEFORE DELETE
  3. ON CLIENTES
  4. FOR EACH ROW
  5. BEGIN
  6. DELETE FROM MEDIDAS WHERE CLIENTES.id_cliente= MEDIDAS.id_cliente;
  7. END

Las tablas tienen estos atributos
CLIENTES
id_cliente PK
nombre
apellido....

MEDIDAS
id_medida
id_cliente FK
pecho
cintura....

Pero me da error y me dice que no existe CLIENTES.id_cliente

A ver si podéis ayudarme, por favor.

Saludos y gracias
  #2 (permalink)  
Antiguo 25/02/2010, 10:25
 
Fecha de Ingreso: febrero-2010
Mensajes: 63
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: Trigger/Disparador: borrar en cascada

SOLUCIONADO:

Código SQL:
Ver original
  1. CREATE TRIGGER BorrarMedidas
  2. BEFORE DELETE
  3. ON CLIENTES
  4. FOR EACH ROW
  5. BEGIN
  6. DELETE FROM MEDIDAS WHERE MEDIDAS.id_cliente = OLD.id_cliente;
  7. END

De todos modos me gustaría que me dijerais si veis bien esta forma de hacerlo, si podría crear inconsistencias o que se yo...

En principio no hay problemas si una clave autonumérica tiene saltos en la numeración mientras esa numeración sea ascendente, ¿verdad?

Por ejemplo:

id_medida
0
1
2
4

Ahí falta la medida 3. Eso no crea ninguna inconsistencia ni nada parecido verdad?

Saludos y gracias

Última edición por AlterElt; 25/02/2010 a las 10:34
  #3 (permalink)  
Antiguo 25/02/2010, 10:25
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Trigger/Disparador: borrar en cascada

Dentro de los TRIGGER no se puede acceder a los valores entrantes con el nombre de la tabla (que por otro lado abarcaría una cantidad de registros y no se pueden hacer comparaciones con "=" entre un valor y un set de valores). Se accede a través de una pseudovariable llamada "NEW", en el caso del registro entrante, u "OLD", en el caso de los UPDATE, para acceder al registro que se está reemplazando.
Mira bien la sintaxis en el manual: SQLITE TRIGGERS

Código SQL:
Ver original
  1. CREATE TRIGGER BorrarMedidas
  2. BEFORE DELETE
  3. ON CLIENTES
  4. FOR EACH ROW
  5.   BEGIN
  6.     DELETE FROM MEDIDAS WHERE id_cliente= NEW.id_cliente;
  7.   END
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 25/02/2010, 11:06
 
Fecha de Ingreso: febrero-2010
Mensajes: 63
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: Trigger/Disparador: borrar en cascada

Justo hemos respuesto a la vez xD

A ver si me puedes contestar lo otro :P

saludos y gracias :D
  #5 (permalink)  
Antiguo 25/02/2010, 11:12
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Trigger/Disparador: borrar en cascada

No hay inconsistencias en tanto sea PK o UNIQUE. Las claves numéricas son, en definitiva, PK y las PK no pueden generar inconsistencias.
Lo que puede generar inconsistencias es que existan registros dependientes mientras su referencia ha desaparecido, pero para ello precisamente están las restricciones de clave foránea.

En tu caso, si las FK de la otra tabla se hubiesen definido con la clausula ON DELETE CASCADE, ni siquiera necesitarías el trigger. El sólo borrado del registro padre haría borrar todos los registros dependientes de todas las tablas donde se haya definido el CASCADE.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 25/02/2010, 17:46
 
Fecha de Ingreso: febrero-2010
Mensajes: 63
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: Trigger/Disparador: borrar en cascada

Cita:
Iniciado por gnzsoloyo Ver Mensaje
No hay inconsistencias en tanto sea PK o UNIQUE. Las claves numéricas son, en definitiva, PK y las PK no pueden generar inconsistencias.
Lo que puede generar inconsistencias es que existan registros dependientes mientras su referencia ha desaparecido, pero para ello precisamente están las restricciones de clave foránea.

En tu caso, si las FK de la otra tabla se hubiesen definido con la clausula ON DELETE CASCADE, ni siquiera necesitarías el trigger. El sólo borrado del registro padre haría borrar todos los registros dependientes de todas las tablas donde se haya definido el CASCADE.
Buenas!

Me parece que leí que SQLite no permite ese tipo de operaciones por eso he pensado en triggers :P

Saludos y gracias!
  #7 (permalink)  
Antiguo 25/02/2010, 18:32
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Trigger/Disparador: borrar en cascada

Esta es la directiva de las cláusulas de FOREIGN KEY de SQLite, conforme su manual (CREATE TABLE Syntax):



Como podrás ver, el ON DELETE CASCADE es una de las opciones posibles, al menos según ellos mismos dicen.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 21/04/2010, 16:11
 
Fecha de Ingreso: abril-2010
Mensajes: 2
Antigüedad: 14 años
Puntos: 0
Respuesta: Trigger/Disparador: borrar en cascada

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Dentro de los TRIGGER no se puede acceder a los valores entrantes con el nombre de la tabla (que por otro lado abarcaría una cantidad de registros y no se pueden hacer comparaciones con "=" entre un valor y un set de valores). Se accede a través de una pseudovariable llamada "NEW", en el caso del registro entrante, u "OLD", en el caso de los UPDATE, para acceder al registro que se está reemplazando.
Mira bien la sintaxis en el manual: [URL="http://www.sqlite.org/lang_createtrigger.html"]SQLITE TRIGGERS[/URL]

Código SQL:
Ver original
  1. CREATE TRIGGER BorrarMedidas
  2. BEFORE DELETE
  3. ON CLIENTES
  4. FOR EACH ROW
  5.   BEGIN
  6.     DELETE FROM MEDIDAS WHERE id_cliente= NEW.id_cliente;
  7.   END
hola, estaba revisando este codigo con otras tablas pero se supone que hace lo mismo(tablas padre hijo , donde se eliminan los hijos de un padre cuando este se elimina de la tabla padre), la duda es que el sql me tira error de sintaxis cerca de la palabra before, alguien que me pueda ayudar, no entiendo por que a nadie mas le dio ese error, por mas que busco en internet las distintas paginas muestran la sentencia para crear un trigger de la misma manera que aqui, sin enbargo no se por que me dice ese error de sintaxis , alguien que me pueda ayudar porfavor ( probe con el mismo ejemplo y sale lo mismo ( estoy usando el sql management studio express 2005)

este es mi codigo:

1.
CREATE TRIGGER hijo_bd
2.
BEFORE DELETE
3.
ON padre
4.
FOR EACH ROW
5.
BEGIN
6.
DELETE FROM hijo WHERE hijo.id_padre = old.id_padre;
7.
END

espero su respuesta muchas gracias.

Etiquetas: borrar, cascada
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:50.