Cancelar opración desde trigger?

31/05/2004 - 12:58 por AC | Informe spam
Buenos días,

SQL2000 + SP3.

Cómo cancelar un operación en curso desde dentro del trigger que ha
desencadenado?
Obviamente se podría lanzar ROLLBACK pero quedaríamos fuera del control de
transacción.

Creo haber leído que se podría efectuar la cancelación mediante RAISERROR,
pero por lo que he probado lanza el mensaje de error pero el trigger
continua y finaliza la operación?

Alguna idea?

Saludos y gracias de antemano.

Preguntas similare

Leer las respuestas

#1 Carlos Sacristan
31/05/2004 - 13:11 | Informe spam
No entiendo a qué te refieres con "[...] quedaríamos fuera del control
de transacción [...]" al lanzar un ROLLBACK.

De todos modos, es que la solución es esa, ya que un RAISERROR no
cancela la ejecución. ¿Por qué no quieres hacerlo de ese modo?



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


"AC" escribió en el mensaje
news:c9f2sj$nhv$
Buenos días,

SQL2000 + SP3.

Cómo cancelar un operación en curso desde dentro del trigger que ha
desencadenado?
Obviamente se podría lanzar ROLLBACK pero quedaríamos fuera del control


de
transacción.

Creo haber leído que se podría efectuar la cancelación mediante RAISERROR,
pero por lo que he probado lanza el mensaje de error pero el trigger
continua y finaliza la operación?

Alguna idea?

Saludos y gracias de antemano.


Respuesta Responder a este mensaje
#2 ulises
31/05/2004 - 15:59 | Informe spam
No he entendido muy bien tus dudas, en todo caso si deseas
cancelaciones parciales de una transacción prueba usando
SAVE TRANSACTION (revisa el detalle en el BOL) a lo mejor
te ayuda.

Saludos,
Ulises

Buenos días,

SQL2000 + SP3.

Cómo cancelar un operación en curso desde dentro del


trigger que ha
desencadenado?
Obviamente se podría lanzar ROLLBACK pero quedaríamos


fuera del control de
transacción.

Creo haber leído que se podría efectuar la cancelación


mediante RAISERROR,
pero por lo que he probado lanza el mensaje de error pero


el trigger
continua y finaliza la operación?

Alguna idea?

Saludos y gracias de antemano.


.

Respuesta Responder a este mensaje
#3 Javier Loria
31/05/2004 - 16:58 | Informe spam
Hola:
Puedes explorar un poco de alternativas si revisas un viejo ejemplo de
un posteo mio:
Un ejemplo:
/* Inicio de Codigo */
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 */
Espero te sirva para aclarar el papel que juegan ROLLBACK Y RAISERROR.
Por otra parte si lo que quieres es no realizar la accion que disparo el
trigger (DELETE, INSERT o UPDATE), pero mantener el resto de la transaccion,
entonces seria mejor que hagas un TRIGGER INSTEAD OF, y bajo ciertas
condiciones no realizas la operacion. Estos triggers se disparan en vez de
la accion, de manera que si no haces nada la tabla queda igual.
Saludos,

Javier Loria
Costa Rica
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.
AC escribio:
Buenos días,

SQL2000 + SP3.

Cómo cancelar un operación en curso desde dentro del trigger que ha
desencadenado?
Obviamente se podría lanzar ROLLBACK pero quedaríamos fuera del
control de transacción.

Creo haber leído que se podría efectuar la cancelación mediante
RAISERROR, pero por lo que he probado lanza el mensaje de error pero
el trigger continua y finaliza la operación?

Alguna idea?

Saludos y gracias de antemano.
Respuesta Responder a este mensaje
#4 Miguel Egea
02/06/2004 - 21:59 | Informe spam
rollback dentro de un trigger no se comporta igual que en un procedimiento
almacenado, asegurate bien que 'quedas fuera de transacción' yo creo que no
es así.


-

Miguel Egea Gómez
Webmaster de PortalSQL

(lo de online sobra)

Microsoft SqlServer M.V.P.

"AC" escribió en el mensaje
news:c9f2sj$nhv$
Buenos días,

SQL2000 + SP3.

Cómo cancelar un operación en curso desde dentro del trigger que ha
desencadenado?
Obviamente se podría lanzar ROLLBACK pero quedaríamos fuera del control


de
transacción.

Creo haber leído que se podría efectuar la cancelación mediante RAISERROR,
pero por lo que he probado lanza el mensaje de error pero el trigger
continua y finaliza la operación?

Alguna idea?

Saludos y gracias de antemano.


Respuesta Responder a este mensaje
#5 Javier Loria
02/06/2004 - 23:30 | Informe spam
Hola Miguel:
yo creo que no es así. ???? <


Viste el codigo del posteo. Que crees que pasa con la insercion del caso
4?
Saludos,

Javier Loria
Costa Rica
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.

Miguel Egea escribio:
rollback dentro de un trigger no se comporta igual que en un
procedimiento almacenado, asegurate bien que 'quedas fuera de
transacción' yo creo que no es así.



"AC" escribió en el mensaje
news:c9f2sj$nhv$
Buenos días,

SQL2000 + SP3.

Cómo cancelar un operación en curso desde dentro del trigger que ha
desencadenado?
Obviamente se podría lanzar ROLLBACK pero quedaríamos fuera del
control de transacción.

Creo haber leído que se podría efectuar la cancelación mediante
RAISERROR, pero por lo que he probado lanza el mensaje de error pero
el trigger continua y finaliza la operación?

Alguna idea?

Saludos y gracias de antemano.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida