Triggers recursivos

31/01/2007 - 18:12 por Tiago Barro | Informe spam
Hola a todos,
necesito crear un trigger recursivo. Es decir, que inserte datos en su
propia tabla y actúe en cuestión.

He conseguido que funcione ejecutando la opción "ALTER DATABASE basedatos
SET RECURSIVE_TRIGGERS ON".

Lo que no me acaba de gustar es que se aplica a toda la base de datos.
De momento no, pero podría darse el caso de encontrarme en un trigger de
otra tabla que no quiero que se ejecute recursivamente.

¿Sabeis si existe alguna manera de indicar que un trigger se ejecute
recursivamente sin tenerlo que indicar a toda la base de datos?


Gracias y un saludo
Santiago Barro

Preguntas similare

Leer las respuestas

#1 Maxi
31/01/2007 - 19:37 | Informe spam
Hola, que inetntas resolver que necesitas un trigger asi?


Salu2

Microsoft MVP SQL Server
Culminis Speaker

"Tiago Barro" escribió en el mensaje
news:ObM%
Hola a todos,
necesito crear un trigger recursivo. Es decir, que inserte datos en su
propia tabla y actúe en cuestión.

He conseguido que funcione ejecutando la opción "ALTER DATABASE basedatos
SET RECURSIVE_TRIGGERS ON".

Lo que no me acaba de gustar es que se aplica a toda la base de datos.
De momento no, pero podría darse el caso de encontrarme en un trigger de
otra tabla que no quiero que se ejecute recursivamente.

¿Sabeis si existe alguna manera de indicar que un trigger se ejecute
recursivamente sin tenerlo que indicar a toda la base de datos?


Gracias y un saludo
Santiago Barro


Respuesta Responder a este mensaje
#2 Alejandro Mesa
31/01/2007 - 19:45 | Informe spam
Tiago Barro,

¿Sabeis si existe alguna manera de indicar que un trigger se ejecute
recursivamente sin tenerlo que indicar a toda la base de datos?



No lo hay. Puedes preparar tus triggers para que en caso de que no quieras
que disparen recursivamente, que paren al chequear la funcion @@NESTLEVEL.
Recuerda el maximo nivel de recursion permitido es 32. Si tu trigger pasa ese
limite, entonces sql server dara error.

Tambien recuerda que existe recursion directa, cuando el trigger ejecuta una
sentencia que hace que este vuelva a dispararse o si la sentencia se ejecuta
en otra tabla que a su vez tiene un trigger que ejecuta una sentencia en la
tabla anterior y hace que el trigger se vuelva a disparar.

Ejemplo:

use northwind
go

if (select databaseproperty('northwind', 'IsRecursiveTriggersEnabled')) = 0
ALTER DATABASE northwind
SET RECURSIVE_TRIGGERS ON
go

create table dbo.t1 (
c1 int not null identity
)
go

- este trigger vuelve a insertar en la tabla donde esta definido
create trigger tr_t1_ins on dbo.t1
for insert
as
print 'tr_t1_ins - ' + ltrim(@@nestlevel)
insert into dbo.t1 default values
go

insert into dbo.t1 default values
go

drop trigger tr_t1_ins
go

truncate table dbo.t1
go

create trigger tr_t1_ins on dbo.t1
for insert
as
print 'tr_t1_ins - ' + ltrim(@@nestlevel)

if @@nestlevel < 5
insert into dbo.t1 default values
go

insert into dbo.t1 default values
go

drop table dbo.t1
go

if (select databaseproperty('northwind', 'IsRecursiveTriggersEnabled')) = 1
ALTER DATABASE northwind
SET RECURSIVE_TRIGGERS OFF
go


AMB


"Tiago Barro" wrote:

Hola a todos,
necesito crear un trigger recursivo. Es decir, que inserte datos en su
propia tabla y actúe en cuestión.

He conseguido que funcione ejecutando la opción "ALTER DATABASE basedatos
SET RECURSIVE_TRIGGERS ON".

Lo que no me acaba de gustar es que se aplica a toda la base de datos.
De momento no, pero podría darse el caso de encontrarme en un trigger de
otra tabla que no quiero que se ejecute recursivamente.

¿Sabeis si existe alguna manera de indicar que un trigger se ejecute
recursivamente sin tenerlo que indicar a toda la base de datos?


Gracias y un saludo
Santiago Barro




Respuesta Responder a este mensaje
#3 Alejandro Mesa
01/02/2007 - 01:19 | Informe spam
Hoy estuve buscando esta funcion y no la encontaba. Esta funcion permite
chequear cuantas veces se ha ejecutado el trigger en cuestion o todos los
triggers disparados por la sentencia que inicio la cadena.

TRIGGER_NESTLEVEL
http://msdn2.microsoft.com/en-us/library/aa260618(sql.80).aspx


AMB


"Alejandro Mesa" wrote:

Tiago Barro,

> ¿Sabeis si existe alguna manera de indicar que un trigger se ejecute
> recursivamente sin tenerlo que indicar a toda la base de datos?

No lo hay. Puedes preparar tus triggers para que en caso de que no quieras
que disparen recursivamente, que paren al chequear la funcion @@NESTLEVEL.
Recuerda el maximo nivel de recursion permitido es 32. Si tu trigger pasa ese
limite, entonces sql server dara error.

Tambien recuerda que existe recursion directa, cuando el trigger ejecuta una
sentencia que hace que este vuelva a dispararse o si la sentencia se ejecuta
en otra tabla que a su vez tiene un trigger que ejecuta una sentencia en la
tabla anterior y hace que el trigger se vuelva a disparar.

Ejemplo:

use northwind
go

if (select databaseproperty('northwind', 'IsRecursiveTriggersEnabled')) = 0
ALTER DATABASE northwind
SET RECURSIVE_TRIGGERS ON
go

create table dbo.t1 (
c1 int not null identity
)
go

- este trigger vuelve a insertar en la tabla donde esta definido
create trigger tr_t1_ins on dbo.t1
for insert
as
print 'tr_t1_ins - ' + ltrim(@@nestlevel)
insert into dbo.t1 default values
go

insert into dbo.t1 default values
go

drop trigger tr_t1_ins
go

truncate table dbo.t1
go

create trigger tr_t1_ins on dbo.t1
for insert
as
print 'tr_t1_ins - ' + ltrim(@@nestlevel)

if @@nestlevel < 5
insert into dbo.t1 default values
go

insert into dbo.t1 default values
go

drop table dbo.t1
go

if (select databaseproperty('northwind', 'IsRecursiveTriggersEnabled')) = 1
ALTER DATABASE northwind
SET RECURSIVE_TRIGGERS OFF
go


AMB


"Tiago Barro" wrote:

> Hola a todos,
> necesito crear un trigger recursivo. Es decir, que inserte datos en su
> propia tabla y actúe en cuestión.
>
> He conseguido que funcione ejecutando la opción "ALTER DATABASE basedatos
> SET RECURSIVE_TRIGGERS ON".
>
> Lo que no me acaba de gustar es que se aplica a toda la base de datos.
> De momento no, pero podría darse el caso de encontrarme en un trigger de
> otra tabla que no quiero que se ejecute recursivamente.
>
> ¿Sabeis si existe alguna manera de indicar que un trigger se ejecute
> recursivamente sin tenerlo que indicar a toda la base de datos?
>
>
> Gracias y un saludo
> Santiago Barro
>
>
>
>
Respuesta Responder a este mensaje
#4 Santiago Barro
01/02/2007 - 08:49 | Informe spam
Muchas gracias a los dos y realmente interesante lo de la función
TRIGGER_NESTLEVEL.
Había logrado controlar el número de recurrencias pero de una manera más
"manual".

Contestando a Maxí, lo que tenemos es una tabla en donde se insertan todos
los movimientos de altas, bajas y modificaciones de stock de artículos.
Esta tabla, mediante un trigger, es la encargada de actualizar el stock real
en la tabla de artículos.

El problema que me encontré es que existen artículos que están formados por
componentes que, en realidad, son otros artículos.
Ejemplo: Una empresa puede crear tres artículos "jabón", "esponja" y
"fregona" y después crear uno nuevo que sea "kit de limpieza" y que esté
compuesto por los 3 anteriores.
El problema es que tenía que conseguir que al vender / comprar un "kit de
limpieza", que generaba un nuevo registro en la tabla de movimientos,
también tenía que insertarse un registro por cada uno de sus componentes.

Lo que hice fue añadir en el trigger de los movimientos una instrucción que
controla si se ha introducido un registro de un artículo con componentes, si
es así, genera tantos registros como componentes, que a su vez, podrían
tener otros componentes. Cada uno de ellos debería actualizar correctamente
su correspondiente stock. Claramente estábamos hablando de una función
recursiva.

Y, como os comenté, activando la recursividad en los triggers me funciona de
maravilla. Sólo tenía que tener en cuenta que no quedara en un bucle
infinito, como sería el caso de que un artículo fuera componente de otro
artículo y viceversa. Pero lo controlé limitando el número de veces que se
debía generar el trigger.

Muchas gracias de nuevo
Un saludo
Santiago Barro

"Alejandro Mesa" escribió en el
mensaje news:
Hoy estuve buscando esta funcion y no la encontaba. Esta funcion permite
chequear cuantas veces se ha ejecutado el trigger en cuestion o todos los
triggers disparados por la sentencia que inicio la cadena.

TRIGGER_NESTLEVEL
http://msdn2.microsoft.com/en-us/library/aa260618(sql.80).aspx


AMB


"Alejandro Mesa" wrote:

Tiago Barro,

> ¿Sabeis si existe alguna manera de indicar que un trigger se ejecute
> recursivamente sin tenerlo que indicar a toda la base de datos?

No lo hay. Puedes preparar tus triggers para que en caso de que no
quieras
que disparen recursivamente, que paren al chequear la funcion
@@NESTLEVEL.
Recuerda el maximo nivel de recursion permitido es 32. Si tu trigger pasa
ese
limite, entonces sql server dara error.

Tambien recuerda que existe recursion directa, cuando el trigger ejecuta
una
sentencia que hace que este vuelva a dispararse o si la sentencia se
ejecuta
en otra tabla que a su vez tiene un trigger que ejecuta una sentencia en
la
tabla anterior y hace que el trigger se vuelva a disparar.

Ejemplo:

use northwind
go

if (select databaseproperty('northwind', 'IsRecursiveTriggersEnabled')) =
0
ALTER DATABASE northwind
SET RECURSIVE_TRIGGERS ON
go

create table dbo.t1 (
c1 int not null identity
)
go

- este trigger vuelve a insertar en la tabla donde esta definido
create trigger tr_t1_ins on dbo.t1
for insert
as
print 'tr_t1_ins - ' + ltrim(@@nestlevel)
insert into dbo.t1 default values
go

insert into dbo.t1 default values
go

drop trigger tr_t1_ins
go

truncate table dbo.t1
go

create trigger tr_t1_ins on dbo.t1
for insert
as
print 'tr_t1_ins - ' + ltrim(@@nestlevel)

if @@nestlevel < 5
insert into dbo.t1 default values
go

insert into dbo.t1 default values
go

drop table dbo.t1
go

if (select databaseproperty('northwind', 'IsRecursiveTriggersEnabled')) =
1
ALTER DATABASE northwind
SET RECURSIVE_TRIGGERS OFF
go


AMB


"Tiago Barro" wrote:

> Hola a todos,
> necesito crear un trigger recursivo. Es decir, que inserte datos en su
> propia tabla y actúe en cuestión.
>
> He conseguido que funcione ejecutando la opción "ALTER DATABASE
> basedatos
> SET RECURSIVE_TRIGGERS ON".
>
> Lo que no me acaba de gustar es que se aplica a toda la base de datos.
> De momento no, pero podría darse el caso de encontrarme en un trigger
> de
> otra tabla que no quiero que se ejecute recursivamente.
>
> ¿Sabeis si existe alguna manera de indicar que un trigger se ejecute
> recursivamente sin tenerlo que indicar a toda la base de datos?
>
>
> Gracias y un saludo
> Santiago Barro
>
>
>
>



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