You are on page 1of 4

/****** Object: Trigger [dbo].

[TR_AUDIT_MT_Activitats] Script Date: 16/05/20


17 11:33:38 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER trigger [dbo].[TR_AUDIT_MT_Activitats] on [dbo].[MT_Activitats] for insert


, update, delete
as
declare @bit int ,
@field int ,
@maxfield int ,
@char int ,
@fieldname varchar(64) ,
@TableName varchar(128) ,
@PKCols varchar(MAX) ,
@sql varchar(MAX),
@UpdateDate varchar(21) ,
@UserName varchar(128) ,
@Type char(1) ,
@PKFieldSelect varchar(MAX),
@PKValueSelect varchar(MAX),
@fieldsNames varchar(MAX) ,
@ValuesOld varchar(MAX),
@ValuesNew varchar(MAX)
select @TableName = 'MT_Activitats'
-- date and user
--select @UserName = system_user ,
SELECT @UpdateDate = convert(varchar(8), getdate(), 112) + ' ' + convert(varchar
(12), getdate(), 114)
-- Action
if exists (select * from inserted)
if exists (select * from deleted)
select @Type = 'U'
else
select @Type = 'I'
else
select @Type = 'D'
-- get list of columns
select * into #ins from inserted
select * into #del from deleted
--
select @UserName = Audit_Usuari from inserted
if (@UserName is null)
select @UserName = Audit_Usuari from deleted
if (@UserName is null)
select @UserName = ISNULL(SYSTEM_USER, 'Desconegut')
-- Get primary key columns for full outer join
select
@PKCols = coalesce(@PKCols + ' and', ' on') + ' i.' + c.COLUMN_NAME + ' = d.' +
c.COLUMN_NAME,
@PKFieldSelect = coalesce(@PKFieldSelect+'+''|''+','') + '''' + COLUMN_NAME + ''
'',
@PKValueSelect = coalesce(@PKValueSelect+'+''|''+','') + 'convert(varchar(1000),
coalesce(i.' + COLUMN_NAME + ',d.' + COLUMN_NAME + '))'
from INFORMATION_SCHEMA.TABLE_CONSTRAINTS pk ,
INFORMATION_SCHEMA.KEY_COLUMN_USAGE c
where pk.TABLE_NAME = @TableName
and CONSTRAINT_TYPE = 'PRIMARY KEY'
and c.TABLE_NAME = pk.TABLE_NAME
and c.CONSTRAINT_NAME = pk.CONSTRAINT_NAME
if @PKCols is null
begin
raiserror('no PK on table %s', 16, -1, @TableName)
return
end
select @field = 0, @maxfield = max(ORDINAL_POSITION) from INFORMATION_SCHEMA.COL
UMNS where TABLE_NAME = @TableName
while @field < @maxfield
begin
select @field = min(ORDINAL_POSITION),@fieldname = COLUMN_NAME
from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME = @TableName and ORDINAL_POSITION > @field
group by ORDINAL_POSITION,COLUMN_NAME
order by ORDINAL_POSITION desc
select @bit = (@field - 1 )% 8 + 1
select @bit = power(2,@bit - 1)
select @char = ((@field - 1) / 8) + 1
if substring(COLUMNS_UPDATED(),@char, 1) & @bit > 0 or @Type in ('I','D')
begin
select
@fieldsNames = coalesce(@fieldsNames +'+''|''+','', '') + '''' + COLUMN_NAME
+ '''',
@ValuesOld = coalesce(@ValuesOld +'+''|''+','', '') + 'dbo.getFieldAudito
ria(Convert(varchar(8000),d.' + c.COLUMN_NAME + '))',
@ValuesNew = coalesce(@ValuesNew +'+''|''+','', '') + 'dbo.getFieldAudito
ria(Convert(varchar(8000),i.' + c.COLUMN_NAME + '))'

from
INFORMATION_SCHEMA.COLUMNS c
where c.TABLE_NAME = @TableName
and c.COLUMN_NAME=@fieldname
end
end
select @sql = 'insert MT_Auditoria (Type, TableName, PrimaryKeyField, PrimaryKey
Value, FieldName, OldValue, NewValue, UpdateDate, UserName)'
select @sql = @sql + ' select ''' + @Type + ''''
select @sql = @sql + ',''' + @TableName + ''''
select @sql = @sql + ',' + @PKFieldSelect
select @sql = @sql + ',' + @PKValueSelect
select @sql = @sql + ',' + @fieldsNames
select @sql = @sql + ',' + @ValuesOld
select @sql = @sql + ',' + @ValuesNew
select @sql = @sql + ',''' + @UpdateDate + ''''
select @sql = @sql + ',''' + @UserName + ''''
select @sql = @sql + ' from #ins i full outer join #del d '
select @sql = @sql + @PKCols
exec (@sql)

GO

You might also like