Ayuda con Trigger

16/03/2006 - 00:42 por Cesar Ochica | Informe spam
Hola a todos

Estoy tratando de implementar un sistemas de auditoria en algunas tablas de
mi base de datos y para tal fin pense en los triggers, y todo iba bien hasta
que llege a este punto:

En mi tabla de auditoria tengo los campos:
ID, TablaEditada, IDFilaEditada, ColumnaEditada, ValAnterior, ValNuevo

me gustaria por ejemplo que al modificar las columnas Año y Edad de un
determinado registro de la tabla clientes en la tabla auditoria se inserten
los siguientes registros:

el sql seria: update clientes set año56, edadq where ID5

ID,TablaEdit,IDFilaEdit,ColumnaEdit,ValAnt, ValNew
1 Clientes 175 Año 1950 1956
2 Clientes 175 Edad 76 71


Agradezco su ayuda.

PDSTA: esto es lo que tengo y funciona bien a excepcion de que no trae el
valor anterior ni el valor nuevo, el resto si lo trae.


CREATE TRIGGER AUD_ciudades ON ciudades
FOR UPDATE
AS

DECLARE @Estado as char(1)
DECLARE @Columnas VARCHAR(1000)

set @Estado='U'

DECLARE cursor_cols CURSOR
FOR
SELECT Column_Name
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME='ciudades'
AND POWER(2,ORDINAL_POSITION-1)&COLUMNS_UPDATED()> 0;

OPEN cursor_cols

DECLARE @Col varchar(15)

FETCH NEXT FROM cursor_cols INTO @Col
WHILE (@@FETCH_STATUS <> -1)
BEGIN
IF (@@FETCH_STATUS <> -2)
BEGIN

insert into MaeAudita
select (select COALESCE(MAX(MA_ID),0)+1 from MaeAudita), @Estado ,
getdate(), 'ciudades', (select d.ciu_id from ciudades m inner join deleted d
on d.ciu_id=m.ciu_id), @col, @AquiValorAnt , @AquiValorNew, SYSTEM_USER,
host_name()
FETCH NEXT FROM cursor_cols INTO @Col
END
END
CLOSE cursor_cols
DEALLOCATE cursor_cols

Preguntas similare

Leer las respuestas

#1 Maxi [MVP]
16/03/2006 - 01:33 | Informe spam
Hola, y de donde sale:@AquiValorAnt , @AquiValorNew




Salu2
-
[MVP] SQL Server
Orador para Culminis Latam
www.sqlgurus.org

MSN:

"Cesar Ochica" escribió en el mensaje
news:
Hola a todos

Estoy tratando de implementar un sistemas de auditoria en algunas tablas
de mi base de datos y para tal fin pense en los triggers, y todo iba bien
hasta que llege a este punto:

En mi tabla de auditoria tengo los campos:
ID, TablaEditada, IDFilaEditada, ColumnaEditada, ValAnterior, ValNuevo

me gustaria por ejemplo que al modificar las columnas Año y Edad de un
determinado registro de la tabla clientes en la tabla auditoria se
inserten los siguientes registros:

el sql seria: update clientes set año56, edadq where ID5

ID,TablaEdit,IDFilaEdit,ColumnaEdit,ValAnt, ValNew
1 Clientes 175 Año 1950 1956
2 Clientes 175 Edad 76 71


Agradezco su ayuda.

PDSTA: esto es lo que tengo y funciona bien a excepcion de que no trae el
valor anterior ni el valor nuevo, el resto si lo trae.


CREATE TRIGGER AUD_ciudades ON ciudades
FOR UPDATE
AS

DECLARE @Estado as char(1)
DECLARE @Columnas VARCHAR(1000)

set @Estado='U'

DECLARE cursor_cols CURSOR
FOR
SELECT Column_Name
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME='ciudades'
AND POWER(2,ORDINAL_POSITION-1)&COLUMNS_UPDATED()> 0;

OPEN cursor_cols

DECLARE @Col varchar(15)

FETCH NEXT FROM cursor_cols INTO @Col
WHILE (@@FETCH_STATUS <> -1)
BEGIN
IF (@@FETCH_STATUS <> -2)
BEGIN

insert into MaeAudita
select (select COALESCE(MAX(MA_ID),0)+1 from MaeAudita), @Estado ,
getdate(), 'ciudades', (select d.ciu_id from ciudades m inner join deleted
d on d.ciu_id=m.ciu_id), @col, @AquiValorAnt , @AquiValorNew,
SYSTEM_USER, host_name()
FETCH NEXT FROM cursor_cols INTO @Col
END
END
CLOSE cursor_cols
DEALLOCATE cursor_cols





Respuesta Responder a este mensaje
#2 Cesar Ochica
16/03/2006 - 16:44 | Informe spam
Hola Maxi,

Como te habras dado cuenta el cursor lo que hace es ir columna por columna
(las modificadas) y la idea es que donde coloque :@AquiValorAnt se saque el
valor que contiene la tabla deleted de la columna en la que este el cursor y
en :@AquiValorNew el valor de la correspondiente columna en la tabla
inserted.

Gracias, espero me puedan ayudar con esto, ya que lo necesito para un
proceso urgente.
Respuesta Responder a este mensaje
#3 Maxi [MVP]
17/03/2006 - 00:51 | Informe spam
Hola, para hacer eso dentro del bucle vas a tener que usar SQL dinamico y
armar la consulta (sp_executesql), no es nada lindo pero si quieres tener
una tabla tan generica no te quedara otra :(


Salu2
-
[MVP] SQL Server
Orador para Culminis Latam
www.sqlgurus.org

MSN:

"Cesar Ochica" escribió en el mensaje
news:
Hola Maxi,

Como te habras dado cuenta el cursor lo que hace es ir columna por columna
(las modificadas) y la idea es que donde coloque :@AquiValorAnt se saque
el valor que contiene la tabla deleted de la columna en la que este el
cursor y en :@AquiValorNew el valor de la correspondiente columna en la
tabla inserted.

Gracias, espero me puedan ayudar con esto, ya que lo necesito para un
proceso urgente.

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