Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
Problem with audit table trigger
Message
From
27/02/2014 12:34:49
 
 
To
27/02/2014 12:25:03
General information
Forum:
Microsoft SQL Server
Category:
Scripting
Environment versions
SQL Server:
SQL Server 2012
Application:
Web
Miscellaneous
Thread ID:
01595410
Message ID:
01595471
Views:
28
Hi, Don,

First, while it's completely different than triggers, I think you might want to check out CDC (change data capture) in SQL 2012.
I have a webcast on it: http://www.bdbiradio.com/
I actually prefer CDC in some instances over triggers.
It's the 1/15 recording. Feel free to pull down the slide deck and/or the webcast video.

OK, on triggers, here's an example I use in training.

First, an audit table...
CREATE TABLE [dbo].[HistoryLog]  ( HistoryPK int identity Primary key,  TableName [varchar](120) , [PrimaryKey] [int] , [columnname] [varchar](150)  , 
      	                                        [oldvalue] [varchar](120),  [newvalue] [varchar](120) , [DateTimeChanged] [datetime] , [username] [varchar](120) )
And then trigger code against the PurchaseOrderHeader table in AdventureWorks, to examine two columns for changes (Freight and ShipDate) and write the changes to the audit table
CREATE TRIGGER [Purchasing].[PurchaseOrderHeader_UPDATE] ON
    [Purchasing].[PurchaseOrderHeader] 
   AFTER  UPDATE 
AS 
BEGIN
	SET NOCOUNT ON;

   -- set Modified date on changed rows, unless the application did it already on the original update

  update Purchasing.PurchaseOrderHeader set ModifiedDate= getdate() 
       from inserted
         join Purchasing.PurchaseOrderHeader ON Inserted.PurchaseOrderID = PurchaseOrderHeader.PurchaseOrderID 
         join Deleted on Inserted.PurchaseOrderID = Deleted.PurchaseOrderID
         where inserted.Freight <> deleted.Freight or inserted.shipdate <> deleted.shipdate


   -- Note...to check if something has been updated, and if the value
   -- has truly changed, don't use the UPDATED statement!....It only 
    -- checks if the column was part of an UPDATE statement...not if it actually changed

  insert into HistoryLog    -- all 1 statement
    SELECT 'Orders', Inserted.PurchaseOrderID,
           'Freight', Deleted.Freight, Inserted.Freight, GETDATE(), SYSTEM_USER
     FROM Inserted
            JOIN Deleted ON Inserted.PurchaseOrderID = Deleted.PurchaseOrderID 
         WHERE Inserted.Freight <> Deleted.Freight


  insert into HistoryLog
    SELECT 'Orders', Inserted.PurchaseOrderID,
           'ShipDate', Deleted.ShipDate, Inserted.ShipDate, GETDATE(), SYSTEM_USER
     FROM Inserted
            JOIN Deleted ON Inserted.PurchaseOrderID= Deleted.PurchaseOrderID
         WHERE Inserted.ShipDate <> Deleted.ShipDate

END
go
Previous
Next
Reply
Map
View

Click here to load this message in the networking platform