Please start any new threads on our new
site at https://forums.sqlteam.com. We've got lots of great SQL Server
experts to answer whatever question you can come up with.
| Author |
Topic |
|
maevr
Posting Yak Master
169 Posts |
Posted - 2009-02-17 : 02:46:48
|
| I need help getting this trigger to work with column names containing empty spaces and special characters, for examplecolumn name: "my column - test"Audit table:[Type] [char](1) NULL,[TableName] [varchar](128) NULL,[PK] [varchar](1000) NULL,[FieldName] [varchar](128) NULL,[OldValue] [varchar](1000) NULL,[NewValue] [varchar](1000) NULL,[UpdateDate] [datetime] NULL,[UserName] [varchar](128) NULLAudit trigger:create TRIGGER tr_Test ON Test FOR INSERT, UPDATE, DELETEASDECLARE @bit INT , @field INT , @maxfield INT , @char INT , @fieldname VARCHAR(128) , @TableName VARCHAR(128) , @PKCols VARCHAR(1000) , @sql VARCHAR(2000), @UpdateDate VARCHAR(21) , @UserName VARCHAR(128) , @Type CHAR(1) , @PKSelect VARCHAR(1000) --You will need to change @TableName to match the table to be auditedSELECT @TableName = 'Test'SELECT @UserName = SYSTEM_USER , @UpdateDate = CONVERT(VARCHAR(8), GETDATE(), 112) + ' ' + CONVERT(VARCHAR(12), GETDATE(), 114)-- ActionIF EXISTS (SELECT * FROM inserted) IF EXISTS (SELECT * FROM deleted) SELECT @Type = 'U' ELSE SELECT @Type = 'I'ELSE SELECT @Type = 'D'-- get list of columnsSELECT * INTO #ins FROM insertedSELECT * INTO #del FROM deleted-- Get primary key columns for full outer joinSELECT @PKCols = COALESCE(@PKCols + ' and', ' on') + ' i.' + c.COLUMN_NAME + ' = d.' + c.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-- Get primary key select for insertSELECT @PKSelect = COALESCE(@PKSelect+'+','') + '''<' + COLUMN_NAME + '=''+convert(varchar(100),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_NAMEIF @PKCols IS NULLBEGIN RAISERROR('no PK on table %s', 16, -1, @TableName) RETURNENDSELECT @field = 0, @maxfield = MAX(ORDINAL_POSITION) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @TableNameWHILE @field < @maxfieldBEGIN SELECT @field = MIN(ORDINAL_POSITION) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @TableName AND ORDINAL_POSITION > @field 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 @fieldname = COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @TableName AND ORDINAL_POSITION = @field SELECT @sql = 'insert Audit (Type, TableName, PK, FieldName, OldValue, NewValue, UpdateDate, UserName)select ''' + @Type + ''',''' + @TableName + ''',' + @PKSelect + ',''' + @fieldname + '''' + ',convert(varchar(1000),d.' + @fieldname + ')' + ',convert(varchar(1000),i.' + @fieldname + ')' + ',''' + @UpdateDate + '''' + ',''' + @UserName + '''' + ' from #ins i full outer join #del d' + @PKCols + ' where i.' + @fieldname + ' <> d.' + @fieldname + ' or (i.' + @fieldname + ' is null and d.' + @fieldname + ' is not null)' + ' or (i.' + @fieldname + ' is not null and d.' + @fieldname + ' is null)' EXEC (@sql) ENDENDGO |
|
|
visakh16
Very Important crosS Applying yaK Herder
52326 Posts |
Posted - 2009-02-17 : 02:53:56
|
| what are you trying to do with this trigger? why use dynamic sql? |
 |
|
|
maevr
Posting Yak Master
169 Posts |
Posted - 2009-02-17 : 03:42:22
|
| The trigger logs changes to the table that the trigger is conntected to. It logs old value and new value, and I dont need to specify each column in the trigger. |
 |
|
|
maevr
Posting Yak Master
169 Posts |
Posted - 2009-02-17 : 08:16:52
|
| The trigger works with all columns that do not contain anu special characters or empty spaces in the column name.Doesn't anyone have an idea on how to solve this? |
 |
|
|
visakh16
Very Important crosS Applying yaK Herder
52326 Posts |
Posted - 2009-02-17 : 08:32:45
|
quote: Originally posted by maevr The trigger logs changes to the table that the trigger is conntected to. It logs old value and new value, and I dont need to specify each column in the trigger.
but trigger already has complete column info inside inserted, deleted tables, then why use INFORMATION_SCHEMA views? |
 |
|
|
|
|
|
|
|