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

After Delete?¿

Estas en el tema de After Delete?¿ en el foro de Bases de Datos General en Foros del Web. Buenas Utilizo el SQL Server Enterprise de microsoft, y para hacer los triggers la palabra "before" no me la reconoce y si pongo q sea ...
  #1 (permalink)  
Antiguo 01/09/2005, 06:06
 
Fecha de Ingreso: diciembre-2003
Mensajes: 288
Antigüedad: 20 años, 4 meses
Puntos: 0
After Delete?¿

Buenas

Utilizo el SQL Server Enterprise de microsoft, y para hacer los triggers la palabra "before" no me la reconoce y si pongo q sea AFTER DELETE no me acaba de ir bien, me explico

Si yo por ejmplo creo un trigger dond declaro una variable y luego le asigno el valor por ejemplo @id=Id from deleted, y luego tengo una sentencia update:

uptade X SET Numero=Numero-1 WHERE ID=@id, no me da fallo pero el update no me actualiza y quisiera saber(si es posible) si hay alguna forma de hacerlo que no sea con AFTER, o como seria

GRACIAS
  #2 (permalink)  
Antiguo 01/09/2005, 14:02
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
SQL Server no tiene la clausula BEFORE, solo tiene AFTER e INSTEAD OF. Tendrás que buscar la manera de apañartelas de esa manera

De cualquier forma, @id = id from deleted es una mala implementación, pues asumes que solo manejarás un registro a la vez (cosa que puedes suponer, pero hace un diseño débil)

Mejor te recomiendo hacer ese update mediante un join con la tabla deleted (o inserted, según convenga) para preventirte en caso de varios registros a la vez.
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #3 (permalink)  
Antiguo 01/09/2005, 14:38
 
Fecha de Ingreso: junio-2002
Mensajes: 243
Antigüedad: 21 años, 10 meses
Puntos: 1
Una preguntilla..relacioanda con los triggers...

si tengo el siguiente trigger..

CREATE TRIGGER trig_down AFTER DELETE ON table1
FOR EACH ROW
UPDATE table2 SET campo1= campo1 - 1 WHERE id = OLD.id_table2;


si hago un.... DELETE FROM table1 WHERE campo2 = 3

y esta consulta borra por ejemplo 2 registros....el trigger se activará 2 veces?

también relacionado con el mismo trigger...

si entre table1 y table2 tengo una relación con DELETE CASCADE donde al eliminar una fila de la tabla 2..se eliminan todas las filas relacionadas con la tabla1...

entonces ese trigger se dispararà? ya q si he eliminado la fila no podrá ser actualizada..

espero haverme explicado minimamente bien.

gracias.
  #4 (permalink)  
Antiguo 02/09/2005, 12:21
 
Fecha de Ingreso: diciembre-2003
Mensajes: 288
Antigüedad: 20 años, 4 meses
Puntos: 0
Cita:
Iniciado por Mithrandir
SQL Server no tiene la clausula BEFORE, solo tiene AFTER e INSTEAD OF. Tendrás que buscar la manera de apañartelas de esa manera

De cualquier forma, @id = id from deleted es una mala implementación, pues asumes que solo manejarás un registro a la vez (cosa que puedes suponer, pero hace un diseño débil)

Mejor te recomiendo hacer ese update mediante un join con la tabla deleted (o inserted, según convenga) para preventirte en caso de varios registros a la vez.

Pues no acabo de entenderlo, yo hago eso de: @id = id from deleted pq quiero recoger el identificador del registro a eliminar, y el update lo igualo a eso pq solo quiero que se modifique cuando hago un delete
  #5 (permalink)  
Antiguo 02/09/2005, 14:59
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
Cita:
Iniciado por lotusxxl
Una preguntilla..relacioanda con los triggers...

si tengo el siguiente trigger..

CREATE TRIGGER trig_down AFTER DELETE ON table1
FOR EACH ROW
UPDATE table2 SET campo1= campo1 - 1 WHERE id = OLD.id_table2;


si hago un.... DELETE FROM table1 WHERE campo2 = 3

y esta consulta borra por ejemplo 2 registros....el trigger se activará 2 veces?
Parece que tu usas otro DBMS, esa sintaxis no es de SQL Server. Pero asumiendo que trabajan de manera similar, la respuesta es no, se activará una sola vez.
Cita:
también relacionado con el mismo trigger...

si entre table1 y table2 tengo una relación con DELETE CASCADE donde al eliminar una fila de la tabla 2..se eliminan todas las filas relacionadas con la tabla1...

entonces ese trigger se dispararà? ya q si he eliminado la fila no podrá ser actualizada..

espero haverme explicado minimamente bien.

gracias.
Se disparará, pero no hará nada, pues la sentencia no regresará ningún registro para trabajar (no verás mensaje de error, pues técnicamente no lo es).
Cita:
Iniciado por kakarot
Pues no acabo de entenderlo, yo hago eso de: @id = id from deleted pq quiero recoger el identificador del registro a eliminar, y el update lo igualo a eso pq solo quiero que se modifique cuando hago un delete
¿Que sucede en el caso de que ejecutes algo como...

DELETE tabla WHERE llave IN (1,2,3,4,5)

Considerando que el trigger se dispara solo una vez (claro, pues es una sola sentencia)?

Obtendrás @id = 1, cosa que es falsa (y por lo tanto solo actualizarás el registro de id=1).

Si la respuesta es algo como "pero eso no va a pasar en mi programa porque yo no uso esas sentencias" es por lo que se considera un diseño débil. Tendrías que considerar todas las posibilidades.

Lo mismo sucederá en sentencias más "de la vida real", como correcciones a campos mal ingresados o fechas incorrectas.
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #6 (permalink)  
Antiguo 02/09/2005, 16:55
 
Fecha de Ingreso: junio-2002
Mensajes: 243
Antigüedad: 21 años, 10 meses
Puntos: 1
ayer estube haciendo pruebas...

osease en el primer caso en el q se hace un delete de 2 registros...el update se hace 2 veces...

no se si cuando decias q solo se disparara 1 vez te referias a q solo se haria el update una vez o a q se disparaba una vez pero en esa vez hacia el update 2 veces.

Y en el segudno caso pues como bien comentas no se aprecia nada...hace el delete cascade correctaemnte y no devuelve ningún mensaje ni nada.

Lo q le dices a kakarot no se si es el mismo caso q lo q te comentaba del update...ya q de triggers en sql server no he hecho...solo en oracle y ahora intentando ahcer lo q puedo con mysql..ya q hasta la version 5.1 segun dicen los de mysql no habran unos triggers minimamente decentes.

Salu2.
  #7 (permalink)  
Antiguo 03/09/2005, 04:09
 
Fecha de Ingreso: diciembre-2003
Mensajes: 288
Antigüedad: 20 años, 4 meses
Puntos: 0
Mithrandir si tienes razon, pero es que por narices el programa solo puede borrar un registro por instruccion, es decir si borro el registro 23 solo sera ste, por lo que el IN en ese caso no me serviria, y es por eso que probe lo del id=... from deleted, asi cojo solo ese registro, pero no lo hace bien :(
  #8 (permalink)  
Antiguo 04/09/2005, 14:31
 
Fecha de Ingreso: diciembre-2003
Mensajes: 288
Antigüedad: 20 años, 4 meses
Puntos: 0
Cita:
Iniciado por Mithrandir

Mejor te recomiendo hacer ese update mediante un join con la tabla deleted (o inserted, según convenga) para preventirte en caso de varios registros a la vez.
Mithrandir, esta parte de aqui como lo puedo hacer?¿, es decir puedo hacer @id=NombreTAbla.CampoTabla from deleted?¿, y luego lo del join?¿

Si el after delete es depues de borrar el INSTEAD OF que signfica?¿
  #9 (permalink)  
Antiguo 05/09/2005, 15:41
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
Cita:
Iniciado por kakarot
Mithrandir, esta parte de aqui como lo puedo hacer?¿, es decir puedo hacer @id=NombreTAbla.CampoTabla from deleted?¿, y luego lo del join?¿
Eso lo logras con un "truco" (mas que truco, característica poco conocida), que es el delete/update de un registro producto de un join.

En el caso de querer borrar registros haces algo como:
DELETE t1
FROM tabla t1
INNER JOIN deleted d
ON t1.llave = d.llave

En caso de quieras hacer un update es con algo como:
UPDATE t1
SET t1.campo = D.campo -123
FROM tabla t1
INNER JOIN deleted d
ON t1.llave = d.llave

El único problema de esta técnica es que no puedes permitir el cambio de valores en la llave primaria de la tabla, pues el JOIN no obtendría los resultados correctos.
Cita:
Si el after delete es depues de borrar el INSTEAD OF que signfica?¿
Es un tipo especial de trigger, en este puedes reemplazar la instrucción de insertado en la tabla en si, no simplemente agregar código extra.

Un ejemplo de donde yo lo utilizo es en tablas con campos de fecha de tipo "fecha de creacion", donde no importa que parámetro pasen siempre deberá ser la fecha de sistema, en ese caso usas un trigger INSTEAD OF para tomar el insert del registro en tus manos y reemplazar el valor de "fecha de creacion" por el de la fecha de sistema.

Otro ejemplo es cuando los utilizan para inserts en vistas particionadas/distribuídas, en base a cierto valor en el registro decides si el insert se hace en un servidor o en otro, de esa manera insertas directamente sobre la vista y los datos caen en diferentes sevidores.
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
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 21:04.