TRIGGER DELETE

23/06/2004 - 11:06 por Celeste | Informe spam
Hola, tengo un trigger de delete que comprueba que para poder borrrar el
registro cumple unas condiciones (que no sea el ultimo con un código
determinado, que no este dado de baja...), es decir muchas comprobaciones,
si yo hago un delete from tabla1 where cod =1 ; me hace las comprobaciones,
es decir, salta el trigger.
El problema es si hago un delete from tabla1.

no salta el trigger y los elimina todos.

¿porque ocurre esto?
¿que debo hacer?
¿deberia usar un cursor??


gracias.

Preguntas similare

Leer las respuestas

#11 Celeste
23/06/2004 - 15:30 | Informe spam
Hola Liliana
lo que tu me comentas esta muy bien, y elimina 1 fila solo xq solo ella
cumple la condición

4, 'S', 1

pero si pruebas con mas registros.
6, 'S', 1
7, 'S', 1
8, 'S', 1
9, 'S', 1


ya veras como sólo elimina 1 (el último).
Respuesta Responder a este mensaje
#12 Liliana Sorrentino
23/06/2004 - 15:39 | Informe spam
Celeste,
Sin modificar NADA del código, y agregando las filas que indicás en la misma
tabla, los resultados son los correctos y te los mando a continuación.
¿Podrías decirme porqué pensás que borra solo la última fila?

id baja codigo
-
1 N 1
2 s 1
3 S 2
4 S 1
5 N 1
6 S 1
7 S 1
8 S 1
9 S 1

(9 filas afectadas)


id baja codigo
-
1 N 1
3 S 2
5 N 1

(3 filas afectadas)


"Celeste" escribió en el mensaje
news:
Hola Liliana
lo que tu me comentas esta muy bien, y elimina 1 fila solo xq solo ella
cumple la condición

4, 'S', 1

pero si pruebas con mas registros.
6, 'S', 1
7, 'S', 1
8, 'S', 1
9, 'S', 1


ya veras como sólo elimina 1 (el último).



Respuesta Responder a este mensaje
#13 Celeste
23/06/2004 - 16:09 | Informe spam
Prueba:



create table otra_lili_test
(id smallint,
baja char(1),
codigo smallint)

insert otra_lili_test select 6, 'N', 1
insert otra_lili_test select 7, 'N', 1
insert otra_lili_test select 8, 'S', 2
insert otra_lili_test select 9, 'S', 1
insert otra_lili_test select 10, 'N', 1

create table lili_test
(id smallint,
baja char(1),
codigo smallint)

insert lili_test select 6, 'N', 1
insert lili_test select 7, 'N', 1
insert lili_test select 8, 'S', 2
insert lili_test select 9, 'S', 1
insert lili_test select 10, 'N', 1

create trigger tr_lili_test on lili_test instead of delete
as
begin
Declare @ID int
Declare @BAJA char(1)
Declare @CODIGO SMALLINT

SELECT @ID = ID, @BAJA = BAJA, @CODIGO = [CODIGO] FROM Deleted

delete from otra_lili_test WHERE ID = @ID

end
go




select * from lili_test
select * from otra_lili_test

otra_lili_test

delete from lili_test


select * from lili_test
select * from otra_lili_test






Y me dices que te parece y el porque.

Igual es que antes no me he explicado bien.

Un saludo.
Respuesta Responder a este mensaje
#14 Liliana Sorrentino
23/06/2004 - 16:26 | Informe spam
Celeste,
En el trigger no necesitás poner las variables para tomar los valores de
Deleted. Como te explicó Carlos, esas variables tendrán los valores de la
última fila afectada.
Tratá de tener en claro la necesidad o no de un trigger.
Por lo expuesto anteriormente, se suponía que lo creabas para determinar
según reglas de negocio, qué filas ibas a eliminar, pero no por selección de
claves. Lo que estás haciendo en este trigger, podrías hacerlo perfectamente
(y mucho más controlado) en tu SP.

Liliana.

"Celeste" escribió en el mensaje
news:#


Prueba:



create table otra_lili_test
(id smallint,
baja char(1),
codigo smallint)

insert otra_lili_test select 6, 'N', 1
insert otra_lili_test select 7, 'N', 1
insert otra_lili_test select 8, 'S', 2
insert otra_lili_test select 9, 'S', 1
insert otra_lili_test select 10, 'N', 1

create table lili_test
(id smallint,
baja char(1),
codigo smallint)

insert lili_test select 6, 'N', 1
insert lili_test select 7, 'N', 1
insert lili_test select 8, 'S', 2
insert lili_test select 9, 'S', 1
insert lili_test select 10, 'N', 1

create trigger tr_lili_test on lili_test instead of delete
as
begin
Declare @ID int
Declare @BAJA char(1)
Declare @CODIGO SMALLINT

SELECT @ID = ID, @BAJA = BAJA, @CODIGO = [CODIGO] FROM Deleted

delete from otra_lili_test WHERE ID = @ID

end
go




select * from lili_test
select * from otra_lili_test

otra_lili_test

delete from lili_test


select * from lili_test
select * from otra_lili_test






Y me dices que te parece y el porque.

Igual es que antes no me he explicado bien.

Un saludo.


Respuesta Responder a este mensaje
#15 Celeste
23/06/2004 - 16:43 | Informe spam
Lo que yo quiero hacer es:

crete trigger td_movimiento on dbo.movimientos for delete as
begin
declare @new_mov_mto int
declare @new_obj_codigo char(10)
declare @new_mov_fecha datetime
declare @new_mov_ubiorigen int
declare @new_mov_ubidestino int
declare @new_mov_documento char(10)
declare @new_mov_descripcion char(10)


declare @old_mov_mto int
declare @old_obj_codigo char(10)
declare @old_mov_fecha datetime
declare @old_mov_ubiorigen int
declare @old_mov_ubidestino int
declare @old_mov_documento char(10)
declare @old_mov_descripcion char(10)

declare @errno int
declare @errmsg char(255)
declare @numrows int

declare @v_ubi_id int
declare @v_obj_codigo char(10)
declare @v_ubi_fecha datetime
declare @v_mov_fecha datetime
declare @v_mov_ubidestino int
declare @v_mov_mto int
declare @variable char(10)
declare @flag_valor int


select
@new_mov_mto = inserted.mov_mto,
@new_obj_codigo = inserted.obj_codigo,
@new_mov_fecha = inserted.mov_fecha,
@new_mov_ubiorigen = inserted.mov_ubiorigen,
@new_mov_ubidestino = inserted.mov_ubidestino,
@new_mov_documento = inserted.mov_documento,
@new_mov_ubidestino = inserted.mov_ubidestino,
@new_mov_descripcion = inserted.mov_descripcion
from inserted

select
@old_mov_mto = deleted.mov_mto,
@old_obj_codigo = deleted.obj_codigo,
@old_mov_fecha = deleted.mov_fecha,
@old_mov_ubiorigen = deleted.mov_ubiorigen,
@old_mov_ubidestino = deleted.mov_ubidestino,
@old_mov_documento = deleted.mov_documento,
@old_mov_ubidestino = deleted.mov_ubidestino,
@old_mov_descripcion = deleted.mov_descripcion
from deleted



select @v_ubi_fecha = obj_fecbaja
from Objetos
where obj_codigo=@old_obj_codigo


if @v_ubi_fecha is not null BEGIN
set @errno = -1002
set @errmsg = 'Este objeto esta dado de baja, no se puede modificar
ni eliminar.'
RAISERROR ( @errmsg,16,1)
goto on_error
END
select @v_mov_mto=max (MOV_MTO)
from MOVIMIENTOS
WHERE obj_codigo = @old_obj_codigo
group by obj_codigo

if @old_mov_mto < @v_mov_mto begin
set @errno = -1002
set @errmsg = 'No se pueden eliminar el movimiento, hay movimientos
posteriores.'
RAISERROR ( @errmsg,16,1)
goto on_error
end

else begin

update UBICACIONES
set obj_codigo=null
where obj_codigo=@old_obj_codigo


update UBICACIONES
set obj_codigo=@old_obj_codigo
where ubi_id=@old_mov_ubiorigen

end
end

end
EXECUTE p_identitymov @OLD_mov_mto



GoTo fim
on_error:
if @@error <> 0 begin
rollback transaction
end
fim:


-
-

Es decir, cuando yo elimino un movimiento, este actualiza la tabla
ubicaciones ESTO FUNCIONA PERFECTAMENTE.

El problema es si desde el analizador de consutlas hago:

delete from movimiento


ya que sólo salta el trigger en el último registro y si este se puede
eliminar se me eliminan todos los registros, si no se puede eliminar ya que
esta el objeto dado de baja o no es el ultimo me genera el mensaje de error
y se cancela todo.

De todas formas, si se hiciera bien el delete me actualizaría la tabla
ubicaciones, pero no lo hace.

Lo que necesito que que si yo escribo : "delete from movimiento " y tengo
1938 registros, que el trigger salte 1938 veces y me actualice la tabla
ubicaciones cada vez y si el número 52 que va a eliminar esta dado de baja
lo cancele todo.

Por lo que veo la única forma es utilizando cursores ya que no encuentro
otra manera o ¿si que la hay?????



Gracias.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida