Resolver el valor de campos dinamicamente en tablas inserted y deleted

29/10/2003 - 10:32 por MONTREL S. A. \(Dpto. Ingeniería Informática\) | Informe spam
Hola a todos, tengo un problema y es que no puedo acceder al valor de un
campo cuyo nombre tengo almacenado en una variable y además, lo estoy
intentando desde un trigger y la tabla en cuestión es inserted y/o deleted.
El código del trigger es el siguiente:

CREATE TRIGGER [trgDETECTA_CAMBIOS] ON [dbo].Tabla1
FOR UPDATE
AS
DECLARE @NumColumnas INT
DECLARE @Contador INT
DECLARE @Nivel INT
DECLARE @Campo sysname
DECLARE @CampoOld varchar(100)
DECLARE @CampoNew varchar(100)
DECLARE @IDTabla INT
DECLARE @Tabla varchar(150)
DECLARE @Comando varchar(200)

SET @Contador=1
SET @Nivel=1
SET @Tabla='Tabla1'
SET @IDTabla=OBJECT_ID(@Tabla)
SELECT @NumColumnas=COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE
TABLE_NAME=@Tabla

WHILE @Contador <= @NumColumnas
BEGIN
SET @Campo=COL_NAME(@IDTabla, @Contador)

IF SUBSTRING(COLUMNS_UPDATED(), @Nivel, 1) = POWER(2, (@Contador-1))
BEGIN


SELECT @CampoNew=@Campo FROM inserted
SELECT @CampoOld=@Campo FROM deleted

INSERT INTO Tabla2 (DESCRIPCION)
VALUES ('Se modificó el campo ' + @Campo + ': ' + @CampoOld +
'->' + @CampoNew)
END

IF @Contador=8
BEGIN
SET @Contador=1
SET @Nivel=@Nivel + 1
END
ELSE
SET @Contador=@Contador + 1

END

También he intentado hacerlo mediante el procedimiento sp_executesql, pero
como es lógico no es factible, ya que el ámbito de las tablas inserted y
deleted se limita simplemente al cuerpo del trigger.

Lo he intentado todo, pero sin éxito.

Saludos y gracias de antemano.


Juan Manuel Cid Muñoz
Dpto. Ingeniería Informática

MONTREL S. A.
 

Leer las respuestas

#1 Accotto Maximiliano Damian
29/10/2003 - 13:18 | Informe spam
Hola!! mira estuve leyendo tu trigger y queria hacerte una pregunta:

Porque guardas un solo valor?

SELECT @CampoNew=@Campo FROM inserted
SELECT @CampoOld=@Campo FROM deleted




esto hara que se guarde un solo valor, quiere decir que si insertas mas de
un registro en la tabla este trigger no se va a comportar bien.

Te pregunto esto por si es una cuestion especial o si esta mal pensado el
trigger. Porque quizas lo q tengamos que ver es q esperas del trigger y como
se podria hacer, (me explico?)

Gracias

Accotto Maximiliano Damian
"MONTREL S. A. (Dpto. Ingeniería Informática)"
escribió en el mensaje news:u1g$
Hola a todos, tengo un problema y es que no puedo acceder al valor de un
campo cuyo nombre tengo almacenado en una variable y además, lo estoy
intentando desde un trigger y la tabla en cuestión es inserted y/o


deleted.
El código del trigger es el siguiente:

CREATE TRIGGER [trgDETECTA_CAMBIOS] ON [dbo].Tabla1
FOR UPDATE
AS
DECLARE @NumColumnas INT
DECLARE @Contador INT
DECLARE @Nivel INT
DECLARE @Campo sysname
DECLARE @CampoOld varchar(100)
DECLARE @CampoNew varchar(100)
DECLARE @IDTabla INT
DECLARE @Tabla varchar(150)
DECLARE @Comando varchar(200)

SET @Contador=1
SET @Nivel=1
SET @Tabla='Tabla1'
SET @IDTabla=OBJECT_ID(@Tabla)
SELECT @NumColumnas=COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE
TABLE_NAME=@Tabla

WHILE @Contador <= @NumColumnas
BEGIN
SET @Campo=COL_NAME(@IDTabla, @Contador)

IF SUBSTRING(COLUMNS_UPDATED(), @Nivel, 1) = POWER(2,


(@Contador-1))
BEGIN


SELECT @CampoNew=@Campo FROM inserted
SELECT @CampoOld=@Campo FROM deleted

INSERT INTO Tabla2 (DESCRIPCION)
VALUES ('Se modificó el campo ' + @Campo + ': ' + @CampoOld


+
'->' + @CampoNew)
END

IF @Contador=8
BEGIN
SET @Contador=1
SET @Nivel=@Nivel + 1
END
ELSE
SET @Contador=@Contador + 1

END

También he intentado hacerlo mediante el procedimiento sp_executesql, pero
como es lógico no es factible, ya que el ámbito de las tablas inserted y
deleted se limita simplemente al cuerpo del trigger.

Lo he intentado todo, pero sin éxito.

Saludos y gracias de antemano.


Juan Manuel Cid Muñoz
Dpto. Ingeniería Informática

MONTREL S. A.


Preguntas similares