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

#6 Celeste
23/06/2004 - 13:26 | Informe spam
Pues las comprobaciones no se como estarán puestas, pero si lo hago para
10000 lo hace sólo para el último .

Cuando sqlserver llama a mi trigger lo hace con el ultimo registro que se
quiere eliminar.

Es decir con el número 1000.

¿no se puede ejecutar el trigger y decir que sea FOR EACH ROW????


Gracias otra vez
Respuesta Responder a este mensaje
#7 Carlos Sacristan
23/06/2004 - 13:35 | Informe spam
Es normal. Si por ejemplo ese trigger está recogiendo un identificador
en una variable, tal y como muestra el siguiente ejemplo:

DECLARE @id INT
SELECT @id=clave FROM DELETED

En ese código se actualiza el valor de la variable con el contenido del
último registro de esa tabla DELETED (que sólo existe dentro del trigger de
eliminación). Si posteriormente se utiliza para realizar comprobaciones,
éstas se harán únicamente con ese valor (obvio). Es decir, que SQL Server no
es que llame al trigger con el último registro eliminado, sino que las
comprobaciones que te comentaba se están haciendo únicamente para ese valor.

Dependiendo del tipo de comprobaciones que tengas que hacer es bastante
probable que no tengas que usar cursores, pero si no posteas el código
(tablas implicadas, trigger), no te vamos a poder ayudar.


Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)

Por favor, responder únicamente al foro
Se agradece la inclusión de sentencias DDL


"Celeste" escribió en el mensaje
news:#
Pues las comprobaciones no se como estarán puestas, pero si lo hago para
10000 lo hace sólo para el último .

Cuando sqlserver llama a mi trigger lo hace con el ultimo registro que se
quiere eliminar.

Es decir con el número 1000.

¿no se puede ejecutar el trigger y decir que sea FOR EACH ROW????


Gracias otra vez


Respuesta Responder a este mensaje
#8 Celeste
23/06/2004 - 13:50 | Informe spam
Eso lo entiendo, pero antes yo trabajaba con informix y cada vez que hacía
un delete me salta el trigger y ahroa no ocurre eso.

Solo quiero saber si eso se puede hacer, comprendo lo del valor devuelto,
pero eso a mi no me interesa, lo que yo quiero es ejecutar el trigger uno a
uno (con o sin cursores).
Respuesta Responder a este mensaje
#9 Carlos Sacristan
23/06/2004 - 14:09 | Informe spam
Es que son cosas diferentes. Ese trigger va a saltar cada vez que
ejecutes una instrucción de borrado de datos, pero es distinto a las
comprobaciones que hagas dentro de su código.

Si quieres que esas comprobaciones sirvan para cada uno de los registros
y tienes que ejecutarlas una a una, no tienes más remedio que utilizar un
cursor (echa un vistazo a ese tema en los BOL), pero te aseguro que un 95%
de las operaciones que se hacen con un cursor se pueden hacer sin ellos
perfectamente. Aquí no te vamos a recomendar nunca usar cursores porque no
son eficientes, por eso siempre vamos a intentar buscar una solución que
maneje conjuntos de resultados tratados como tal, no individualmente.

Informix no es SQL Server, no puedes pretender que un código funcione
igual en un gestor que en otro, pero te aseguro que si ejecutas una
instrucción DELETE y ésta tiene asociado un trigger, SQL Server lo va a
lanzar.


Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)

Por favor, responder únicamente al foro
Se agradece la inclusión de sentencias DDL


"Celeste" escribió en el mensaje
news:#
Eso lo entiendo, pero antes yo trabajaba con informix y cada vez que hacía
un delete me salta el trigger y ahroa no ocurre eso.

Solo quiero saber si eso se puede hacer, comprendo lo del valor devuelto,
pero eso a mi no me interesa, lo que yo quiero es ejecutar el trigger uno


a
uno (con o sin cursores).




Respuesta Responder a este mensaje
#10 Liliana Sorrentino
23/06/2004 - 15:11 | Informe spam
Hola Celeste,

Con el permiso de Carlos, además de estar de acuerdo con él en todos los
comentarios que te hace, creo que este ejemplo te demostrará que el trigger
se ejecuta para "cada fila" de la tabla.
Pero sería bueno que pudieras pensar en "conjunto de filas", es como trabaja
SQL.
En lo particular, no soy fanática de los triggers, a menos que lleve una
auditoría de mis datos. Varias veces hemos visto compañeros que plantean
dudas sobre lo que pasa con la información de sus tablas, hasta que se dan
cuenta que algún trigger no tenido en cuenta justificaba lo sucedido.
Si tu caso pensás que es necesario para evaluar si vas o no a borrar una
fila, te sugiero, igual que Carlos, que lo hagas en tu SP.

Saludos... Liliana.

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

insert lili_test select 1, 'N', 1
insert lili_test select 2, 'N', 1
insert lili_test select 3, 'S', 2
insert lili_test select 4, 'S', 1
insert lili_test select 5, 'N', 1
go

create trigger tr_lili_test on lili_test instead of delete
as
begin
delete from lili_test
where baja = 'S' and codigo = 1
end
go

select * from lili_test

delete from lili_test

select * from lili_test



"Celeste" escribió en el mensaje
news:#
Eso lo entiendo, pero antes yo trabajaba con informix y cada vez que hacía
un delete me salta el trigger y ahroa no ocurre eso.

Solo quiero saber si eso se puede hacer, comprendo lo del valor devuelto,
pero eso a mi no me interesa, lo que yo quiero es ejecutar el trigger uno


a
uno (con o sin cursores).




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