Bonjour tous le monde,
j'aurai besoin d'aide pour un trigger. Ce trigger a pour but de noté les modifications faite dans un table dans un autre table. C'est donc un trigger d'audit d'une table.
Chaque fois que quelqu'un modifie une table, le trigger note dans la table audit (qui est identique a l'autre table) l'utilisateur qui a modifier ou ajouter quelque chose dans la table et elle note quelle colonne a été modifier.
voila le code que j'ai de fait:
Code :
ALTER TRIGGER Trigger4
ON dbo.test_table1
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
DECLARE @FldsUpdated AS varCHAR(2000)
DECLARE @ColumnsUpdated VARBINARY(100)
SET @ColumnsUpdated = COLUMNS_UPDATED()
DECLARE @columnName AS varCHAR(255)
DECLARE @tableName AS varCHAR(255)
DECLARE @tableSchema AS varCHAR(255)
DECLARE @hasChanged AS INT
Declare @Totalstring as varchar(1000)
DECLARE curTableColumns CURSOR FOR
SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'test_table1'
set @totalstring = ''
set @FldsUpdated = ''
OPEN curTableColumns
FETCH NEXT FROM curTableColumns INTO @tableSchema, @tableName, @columnName
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @hasChanged = master.dbo.SYSTEM_IsBitSetInBitmask
(
@ColumnsUpdated,
(select colid
from syscolumns
where id = OBJECT_ID('dbo.test_table1')
and name = @columnName)
)
IF @hasChanged <> 0
begin
SET @FldsUpdated = @columnName
set @totalstring = @totalstring + @FldsUpdated + ','
end
FETCH NEXT FROM curTableColumns INTO @tableSchema, @tableName, @columnName
END
CLOSE curTableColumns
DEALLOCATE curTableColumns
insert into test_table2
(value1,value2,value3,columnsUpdated)
SELECT value1, value2, value3, @totalstring
FROM INSERTED
End
--Fonction master.dbo.SYSTEM_IsBitSetInBitmask
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
ALTER function SYSTEM_IsBitSetInBitmask
(@bitmask varbinary(500), @colid int)
returns int
as
begin
declare @word smallint
declare @bit smallint
declare @mask binary(2)
declare @mval int
declare @oldword binary(2)
if @colid < 1 return 0
SELECT @word = 1 + FLOOR((@colid -1)/16)
SELECT @bit = (@colid -1) % 16
SELECT @mval = POWER(2, @bit)
SELECT @mask = convert( binary(2), unicode( substring( convert( nchar(2), convert( binary(4), @mval ) ), 2, 1 ) ) )
SELECT @oldword = convert( binary(2), SUBSTRING( convert( nvarchar(64),@bitmask), @word, 1) )
IF @oldword IS NULL return 0
return convert( smallint, @oldword ) & convert( smallint, @mask )
end
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
Je tien a préciser que je suis en SQL Server 2000
La fonction master.dbo.SYSTEM_IsBitSetInBitmask est une fonction prit de sql server 2005, j'ai seulement copier le code de la fonction sys.fn_IsBitSetInBitmask de sql server 2005.
je ne suis pas capable d'avoir les colonne qui on été updater dans la variable totalstring pour ensuite l'afficher on dirai qu'il y a un problème dans la fonction de sql server 2005.
Merci beaucoup d'avance pour votre aide