I have a trigger that I created to log changes in one table to another
table but it is horribly inefficient.
I am hoping that someone with more experience than I can see a way to
make this trigger more efficient.
------------
ALTER TRIGGER tContacts_ChangeLog
ON dbo.Contacts
FOR UPDATE
AS
SET NOCOUNT ON
DECLARE @tablename varchar(20),
@record_id_column varchar(30),
@colname varchar(30),
@colvalue varchar(8000),
@insertstmt varchar(1500),
@username varchar(20)
SELECT @tablename = 'Contacts'
SELECT @record_id_column = 'ContactID'
DECLARE columns_cursor CURSOR LOCAL FOR
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @tablename
AND (POWER(2, (ORDINAL_POSITION-1) % 8) & CONVERT(INT,
SUBSTRING(COLUMNS_UPDATED(), (ORDINAL_POSITION-1)/8 + 1, 1))) <> 0
SELECT * INTO #del FROM deleted
SELECT * INTO #ins FROM inserted
SELECT @username = RIGHT(SYSTEM_USER, LEN(SYSTEM_USER) -
CHARINDEX('\',SYSTEM_USER))
OPEN columns_cursor
FETCH NEXT FROM columns_cursor INTO @colname
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @insertstmt = 'INSERT INTO ' + @tablename + '_ChangeLog (
recordid, fieldname, changedfrom, changedto, username, datetime ) ' +
'SELECT d.' + @record_id_column + ', ''' + @colname + ''', d.' +
@colname + ', i.' + @colname + ', ''' + @username + ''', GETDATE()' +
'FROM #del d INNER JOIN #ins i ON d.' + @record_id_column + ' = i.' +
@record_id_column + ' WHERE (i.' + @colname + ' <> d.' + @colname + ')'
+
' OR (i.' + @colname + ' IS NOT NULL AND ' + 'd.' + @colname + ' IS
NULL) OR (i.' + @colname + ' IS NULL AND ' + 'd.' + @colname + ' IS NOT
NULL)'
-- INSERT INTO Debug (value) VALUES( @insertstmt )
EXEC( @insertstmt )
FETCH NEXT FROM columns_cursor INTO @colname
END
CLOSE columns_cursor
DEALLOCATE columns_cursor