Tablas deleted e inserted en código genérico

08/10/2009 - 23:11 por Carlos M. Calvelo | Informe spam
Hola a todos,

Si en un trigger se quiere hacer algo con sql dinámico o pasar
control a una función o procedimiento almacenado, las tablas
deleted e inserted ya no son accesibles.

La única forma que se me ocurre es hacer una copia de las tablas
(tablas temporales o variables) y utilizar las copias.

Concretamente, en el trigger, hacer algo como:

-
select * into #del from deleted
select * into #ins from inserted


drop table #ins
drop table #del
-

Pero no me gusta esto. Con una operación sobre una tabla lo
suficientemente grande no me parece una buena idea.

Se trata de funcionalidad genérica para registrar todos los cambios
en una u otra tabla. La cosa ya funciona (SS2005) pero este aspecto
no me gusta mucho. Obviamente la idea de simplemente repetir el
código genérico en los triggers donde sea necesario tampoco es muy
atractiva (mantenimiento). Vendría bien para esto algo como macros.
Quizás un procedimiento que genere el código en los triggers.
Hmmm.. es posible.

Pues bien. Es posible de alguna manera utilizar directamente las
tablas inserted y deleted (evitando así hacer copias) en este tipo
de situaciones? Algún otro truco o idea?

Saludos,
Carlos
 

Leer las respuestas

#1 Alejandro Mesa
09/10/2009 - 01:53 | Informe spam
Hola Carlos,

Una forma que he visto, es usnado la clausula "output" en las sentencia DML,
donde puedes referenciar ambas tablas [deleted] e [inserted].

Si tienes acceso a SS 2008, entonces puedieras usar las nuevas
funcionalidades ""Change Tracking" y "Change Data Capture".


AMB


"Carlos M. Calvelo" wrote:

Hola a todos,

Si en un trigger se quiere hacer algo con sql dinámico o pasar
control a una función o procedimiento almacenado, las tablas
deleted e inserted ya no son accesibles.

La única forma que se me ocurre es hacer una copia de las tablas
(tablas temporales o variables) y utilizar las copias.

Concretamente, en el trigger, hacer algo como:

-
select * into #del from deleted
select * into #ins from inserted


drop table #ins
drop table #del
-

Pero no me gusta esto. Con una operación sobre una tabla lo
suficientemente grande no me parece una buena idea.

Se trata de funcionalidad genérica para registrar todos los cambios
en una u otra tabla. La cosa ya funciona (SS2005) pero este aspecto
no me gusta mucho. Obviamente la idea de simplemente repetir el
código genérico en los triggers donde sea necesario tampoco es muy
atractiva (mantenimiento). Vendría bien para esto algo como macros.
Quizás un procedimiento que genere el código en los triggers.
Hmmm.. es posible.

Pues bien. Es posible de alguna manera utilizar directamente las
tablas inserted y deleted (evitando así hacer copias) en este tipo
de situaciones? Algún otro truco o idea?

Saludos,
Carlos

Preguntas similares