Trigger y cancelación de operación en curso.

25/07/2003 - 10:41 por AC | Informe spam
Buenos días,

Tengo una duda respecto a como cancelar la operación en curso en el trigger
que ha desencadenado.
Una forma creo sería RAISERROR que generaría un error, une mensaje para el
usuario y cancelaría la operación. ¿ Es correcto?
Si no se quiere ningún mensaje de error, ¿cómo se puede cancelar la
operación en curso dentro del trigger?

Gracias de antemano, y saludos.

Preguntas similare

Leer las respuestas

#6 AC
25/07/2003 - 20:55 | Informe spam
Gracias por el interés, por las respuestas y por el ejemplo.
Vistas vuestras recomendaciones de precaución de uso del ROLLBACK en
triggers, seguramente hay algo que no he entendido, porque a pesar del
ejemplo no acabo de ver los problemas que puede reportar.
Seguramente es un problema mío, por lo que agradecería si me pudieseis dar
una referencia de alguna documentación al respecto.

Gracias de antemano.

"Miguel Egea" escribió en el mensaje
news:
Hay que tener mucho cuidado con los triggers, y con las transacciones, te
pongo un ejemplo puedes ejecutarlo y verás cual es el comportamiento.


use tempdb
go
create table a (id int)
go
create trigger trg_a on a for insert,update,delete
as
begin
set nocount on
select id from inserted where id=2
if @@rowcount=0
begin
print 'solo permitimos insertar el número 2'
raiserror ('Esto es un error, pero naturalmente no para la
ejecución...',16,1)
print 'pero por aquí si paso'
print 'número de transacciones ' + cast(@@trancount as


varchar)
rollback
print 'Paso aunque hay ejecutado rollback. número de
transacciones ' + cast(@@trancount as varchar)
print '¡OJO que estoy fuera de transacciones..!'
return
print 'por aquí no paso'
end
set nocount off
end
go
insert into a values(1)
go
insert into a values (2)
select * from a



Espero que te sirva.

Saludos
Miguel Egea
http://www.portalsql.com
Sql-Server MVP
"AC" escribió en el mensaje
news:bfqqhd$cmh$
> Buenos días,
>
> Tengo una duda respecto a como cancelar la operación en curso en el
trigger
> que ha desencadenado.
> Una forma creo sería RAISERROR que generaría un error, une mensaje para


el
> usuario y cancelaría la operación. ¿ Es correcto?
> Si no se quiere ningún mensaje de error, ¿cómo se puede cancelar la
> operación en curso dentro del trigger?
>
> Gracias de antemano, y saludos.
>
>


Respuesta Responder a este mensaje
#7 Javier Loria\(MVP\)
28/07/2003 - 20:21 | Informe spam
Hola Miguel:
Tal vez no entiendo lo que dices, pero asumiendo que el procedimiento
que invoca la modificacion usa transacciones, NO deberia tener problema con
la transaccion ya que el Trigger hace un ROLLBACK de SU TRANSACCION que esta
ANIDADA dentro de la Transancaccion del Procedimiento lo que significa que
TODA esta transaccion queda anulada.
Lo que si comparto es que el codigo despues del ROLLBACK dentro del
TRIGGER queda fuera de la Transaccion, y por lo que crea su propia
transaccion que es independiente de la del Procedimiento que ya esta
cancelada.

Un ejemplo:
/* Inicio de Codigo */
DROP TABLE PRUEBATRIGGER
CREATE TABLE PruebaTrigger(
Id INT NOT NULL PRIMARY KEY
)
GO

CREATE TRIGGER InsPruebaTrigger
ON PruebaTrigger
FOR INSERT
AS
BEGIN
SET NOCOUNT ON
IF EXISTS (SELECT ID FROM INSERTED WHERE Id=1)
BEGIN
RAISERROR ('ID 1 NO es Permitido', 16, 10)
END
IF EXISTS (SELECT ID FROM INSERTED WHERE Id=2)
BEGIN
ROLLBACK
END
IF EXISTS (SELECT ID FROM INSERTED WHERE Id=3)
BEGIN
ROLLBACK
RAISERROR ('ID 3 NO es Permitido', 16, 10)
END
IF EXISTS (SELECT ID FROM INSERTED WHERE Id=4)
BEGIN
ROLLBACK
INSERT PruebaTrigger
VALUES (100)
END
END
GO

BEGIN TRAN
INSERT PruebaTrigger
VALUES (1)
INSERT PruebaTrigger
VALUES (11)
COMMIT
GO
SELECT * FROM PruebaTrigger
GO
BEGIN TRAN
INSERT PruebaTrigger
VALUES (2)
INSERT PruebaTrigger
VALUES (12)
COMMIT
GO
SELECT * FROM PruebaTrigger
GO
BEGIN TRAN
INSERT PruebaTrigger
VALUES (3)
INSERT PruebaTrigger
VALUES (13)
COMMIT
GO
SELECT * FROM PruebaTrigger
GO

BEGIN TRAN
INSERT PruebaTrigger
VALUES (4)
INSERT PruebaTrigger
VALUES (14)
COMMIT
SELECT * FROM PruebaTrigger

/* Fin de Codigo */

Saludos,



Javier Loria
Costa Rica (MVP)
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

El problema es que en cuanto haces rollback la siguiente instrucción
(que sigue ejecutandose) está fuera de transacciones y por tanto lo
que hagas será definitivo en la base de datos. Esto si lo juntas con
un trigger, es aún más complicado, ya que el trigger se dispara por
la actuación en una tabla, pero quízá eso se produzca dentro de un
procedimiento almacenado o de otro trigger. En definitiva, todo lo
que viene después de un update en un procedimiento almacenado podría
ser ejecutado fuera de transacciones. Si por ejemplo insertas un
registro después, ese último registro podría permanecer en tu base de
datos, cuando sin embargo todos los que produjeron que ese registro
se insertara no están, dando lugar a fuertes inconsistencias.



Saludos
Miguel Egea
http://www.portalsql.com
Sql-Server MVP
"AC" escribió en el mensaje
news:bfrqnd$ltg$
Gracias por el interés, por las respuestas y por el ejemplo.
Vistas vuestras recomendaciones de precaución de uso del ROLLBACK en
triggers, seguramente hay algo que no he entendido, porque a pesar
del ejemplo no acabo de ver los problemas que puede reportar.
Seguramente es un problema mío, por lo que agradecería si me
pudieseis dar una referencia de alguna documentación al respecto.

Gracias de antemano.

"Miguel Egea" escribió en el mensaje
news:
Hay que tener mucho cuidado con los triggers, y con las
transacciones, te pongo un ejemplo puedes ejecutarlo y verás cual
es el comportamiento.


use tempdb
go
create table a (id int)
go
create trigger trg_a on a for insert,update,delete
as
begin
set nocount on
select id from inserted where id=2
if @@rowcount=0
begin
print 'solo permitimos insertar el número 2'
raiserror ('Esto es un error, pero naturalmente no para
la ejecución...',16,1)
print 'pero por aquí si paso'
print 'número de transacciones ' + cast(@@trancount as
varchar) rollback
print 'Paso aunque hay ejecutado rollback. número de
transacciones ' + cast(@@trancount as varchar)
print '¡OJO que estoy fuera de transacciones..!'
return
print 'por aquí no paso'
end
set nocount off
end
go
insert into a values(1)
go
insert into a values (2)
select * from a



Espero que te sirva.

Saludos
Miguel Egea
http://www.portalsql.com
Sql-Server MVP
"AC" escribió en el mensaje
news:bfqqhd$cmh$
Buenos días,

Tengo una duda respecto a como cancelar la operación en curso en
el trigger que ha desencadenado.
Una forma creo sería RAISERROR que generaría un error, une mensaje
para el usuario y cancelaría la operación. ¿ Es correcto?
Si no se quiere ningún mensaje de error, ¿cómo se puede cancelar la
operación en curso dentro del trigger?

Gracias de antemano, y saludos.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida