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:

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.
Respuesta Responder a este mensaje
#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:

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:

> 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.
Respuesta Responder a este mensaje
#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:
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:

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:

> 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.
Respuesta Responder a este mensaje
#4 Paco
19/01/2008 - 13:07 | Informe spam
Me ha ido perfecto, muchas gracias por la ayuda

"Jesús López" wrote:

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:
> 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:
>
>> 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:
>>
>> > 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.



email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida