Create a trigger that inserts values into a new table when a column is updated
Something like this should do what you need. You would have the INSERT
statements below insert values indicating the operation performed into MyLogTable
.
CREATE TRIGGER [dbo].[TRIG_MyTable]ON [dbo].[MyTable]AFTER INSERT, UPDATEAS DECLARE @INS int, @DEL intSELECT @INS = COUNT(*) FROM INSERTEDSELECT @DEL = COUNT(*) FROM DELETEDIF @INS > 0 AND @DEL > 0 BEGIN -- a record got updated, so log accordingly. INSERT INTO MyLogTable SELECT 'New Values', getdate() FROM INSERTED INSERT INTO MyLogTable SELECT 'Old Values', getdate() FROM DELETEDENDELSE BEGIN -- a new record was inserted. INSERT INTO MyLogTable SELECT 'Insert', getdate() FROM INSERTEDEND
If you wanted to you could also add columns from INSERTED
and DELETED
to your log table as well if you wanted to capture the actual column values that got inserted or updated.
This is for all changes and all columns, but you can modify how you like:
USE [DB]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TRIGGER [dbo].[trMyTrigger]ON [dbo].[MyTable]AFTER INSERT, UPDATE, DELETENOT FOR REPLICATIONAS -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with caller queries select statements. -- if an update/insert/delete occurs on the main table, the number of records affected -- should only be based on that table and not what records the triggers may/may not -- select.SET NOCOUNT ON; -- Determine if this is an insert,update, or delete action DECLARE @action AS CHAR(1) DECLARE @count AS INT SET @action = 'I' -- SET action to 'I'NSERT by default. SELECT @count = count(*) FROM DELETED IF @count > 0 BEGIN SET @action= 'D' -- SET action to 'D'ELETED. SELECT @count = count(*) FROM INSERTED IF @count > 0 SET @action = 'U' -- SET action to 'U'PDATED. END IF @action = 'D' -- THIS IS A DELETE RECORD ACTION BEGIN INSERT INTO myBackupTable SELECT *,GETDATE() AS changeDate, 'DELETE' AS task FROM DELETED END ELSE BEGIN IF @action = 'I' -- this is an INSERT record action BEGIN INSERT INTO myBackupTable SELECT *,GETDATE() AS changeDate, 'INSERT' as task FROM INSERTED END ELSE -- this is an UPDATE record action BEGIN INSERT INTO myBackupTable SELECT *,GETDATE() AS changeDate, 'UPDATE' as task FROM INSERTED END END
create trigger trigge on abs
instead of update as
declare @idd int , @pricee money select @idd= ProductID from inserted select @pricee = ListPrice from inserted insert into prod values ( @idd , @pricee) print ' cannot change'