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 et la date de la modification.
voila le code que j'ai de fait:
Le code du trigger:
Le code de la fonction SYSTEM_LogUpdateTriggerChanges:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 ALTER TRIGGER Trigger4 ON dbo.test_table1 AFTER INSERT, UPDATE, DELETE AS BEGIN DECLARE @TotalString as VARCHAR(50) DECLARE @ColumnsUpdated as VARBINARY(1000) SET @ColumnsUpdated = COLUMNS_UPDATED() select @TotalString = master.dbo.SYSTEM_LogUpdateTriggerChanges ('test_table1','dbo',@ColumnsUpdated) INSERT INTO test_table2 ( userid, value1, value2, value3, columnsUpdated, COLUMNS_UPDATED_Value) SELECT USER_NAME(), value1, value2, value3, @totalstring, @ColumnsUpdated FROM INSERTED END
Le code de la fontion SYSTEM_IsBitSetInBitmask (fonction qui est a l'intérieur de ma fonction):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64 ALTER FUNCTION SYSTEM_LogUpdateTriggerChanges ( @Table VARCHAR(100),@Schema VARCHAR(100),@ColumnsUpdated AS VARBINARY(500) ) RETURNS VARCHAR(1000) AS BEGIN DECLARE @FldsUpdated AS VARCHAR(2000) 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 @NomTable as varchar(100) set @NomTable = @Schema + '.' + @Table DECLARE curTableColumns CURSOR FOR SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @NomTable 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(@tableSchema + '.' + @tableName) 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 RETURN @TotalString END
Je tien a préciser que je suis en SQL Server 2000
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 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
La fonction 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.
Mon problème est que ma fonction SYSTEM_LogUpdateTriggerChanges retourne toujours rien alors qu'elle serait suposer retourné les colones qui on été modifier. Si je sort le code de la fonction il marche alors je ne comprend pas pourquoi il ne marche pas dans la fonction
Merci beaucoup d'avance pour votre aide
Partager