Transacciones en triggers

18/01/2008 - 20:20 por Paco | Informe spam
Hola a todos

Tengo un pequeño problema.

Estoy trabajando con SQL 2005.
Tengo unos triggers On Delete que controlan una serie de referencias en
tablas. Me pasa que cuando ejecuto un delete de una tabla el trigger se lanza
y me devuelve error pero aún y así se elimina el registro.
¿Tengo que configurar algo en SQL para que los triggers estén implicitos en
la transacción del registro que los provoca?
Todo esto me pasa en el sql management studio.
He probado de poner en mi programa un begin y end transaction y no borra el
registro. Por eso he pensado que a lo mejor hay algún parámetro de
configuración que me permita que sql controle este tema sólo.

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
18/01/2008 - 21:46 | Informe spam
Paco,

Los triggers corren dentro de la transaccion que provoca que se dispare. Si
no abristes una transaccion explicitamente, entonces corre en la transaccion
implicita (cada sentencia corre en su propia transaccion al menos que las
agrupes entre begin tran y commit / rollback). No todos los errores abortan
la transaccion en curso al menos que use SET XACT_ABORT.

Como bien dijistes, debes encerrar la transaccion en un BEGIN TRANSACTION y
capturar errores, para que en el caso requerido puedas hacer ROLLBACK de la
transaccion.


AMB

"Paco" wrote:

Mostrar la cita
#2 Paco
19/01/2008 - 10:37 | Informe spam
Gracias por la respuesta

Si no he entendido mal, en circunstancias normales el trigger debería
abortar la transacción que lo provocó. Tal vez el problema esté en el código
del trigger, pero mi error no anula la transacción si no abro yo la
transacción desde mi programa. Aquí está el código de ese trigger por si veis
algo raro o falta algo.

CREATE TRIGGER [D_Entidades]
ON [Entidades]
FOR DELETE
AS
DECLARE @ant VARCHAR(20)
SELECT @ant = Entidad FROM Deleted

IF EXISTS (SELECT * FROM Cuentas WHERE (Cuentas.Entidad = @ant))
BEGIN
RAISERROR ('Entidad con cuenta abierta',16, 1)
RETURN
END

IF EXISTS (SELECT * FROM Tarifas WHERE (Tarifas.Entidad = @ant))
BEGIN
RAISERROR ('Entidad con tarifas',16, 1)
RETURN
END

RETURN


Muchas gracias

"Alejandro Mesa" wrote:

Mostrar la cita
#3 Jesús López
19/01/2008 - 11:18 | Informe spam
Faltan los ROLLBACK dentro del trigger:

CREATE TRIGGER [D_Entidades]
ON [Entidades]
FOR DELETE
AS
DECLARE @ant VARCHAR(20)
SELECT @ant = Entidad FROM Deleted

IF EXISTS (SELECT * FROM Cuentas WHERE (Cuentas.Entidad = @ant))
BEGIN
ROLLBACK
RAISERROR ('Entidad con cuenta abierta',16, 1)
RETURN
END

IF EXISTS (SELECT * FROM Tarifas WHERE (Tarifas.Entidad = @ant))
BEGIN
ROLLBACK
RAISERROR ('Entidad con tarifas',16, 1)
RETURN
END



"Paco" escribió en el mensaje
news:
Mostrar la cita
#4 Paco
19/01/2008 - 13:07 | Informe spam
Me ha ido perfecto, muchas gracias por la ayuda

"Jesús López" wrote:

Mostrar la cita
Ads by Google
Search Busqueda sugerida