Northwind Database (Document! X Sample)
AdventureWorks Database / Purchasing Schema / Purchasing.PurchaseOrderDetail Table / uPurchaseOrderDetail Trigger
In This Topic
    uPurchaseOrderDetail Trigger
    In This Topic
    Description
    AFTER UPDATE trigger that inserts a row in the TransactionHistory table, updates ModifiedDate in PurchaseOrderDetail and updates the PurchaseOrderHeader.SubTotal column.
    Properties
    Creation Date27/10/2017 14:33
    Encrypted
    Ansi Nulls
    Trigger Type
    Insert Delete Update After Instead Of
    Trigger Definition
    CREATE TRIGGER [Purchasing].[uPurchaseOrderDetail] ON [Purchasing].[PurchaseOrderDetail] 
    AFTER UPDATE AS 
    
    BEGIN
        DECLARE @Count int;
    
        SET @Count = @@ROWCOUNT;
        IF @Count = 0 
            RETURN;
    
        SET NOCOUNT ON;
    
        BEGIN TRY
            IF UPDATE([ProductID]) OR UPDATE([OrderQty]) OR UPDATE([UnitPrice])
            -- Insert record into TransactionHistory 
            BEGIN
                INSERT INTO [Production].[TransactionHistory]
                    ([ProductID]
                    ,[ReferenceOrderID]
                    ,[ReferenceOrderLineID]
                    ,[TransactionType]
                    ,[TransactionDate]
                    ,[Quantity]
                    ,[ActualCost])
                SELECT 
                    inserted.[ProductID]
                    ,inserted.[PurchaseOrderID]
                    ,inserted.[PurchaseOrderDetailID]
                    ,'P'
                    ,GETDATE()
                    ,inserted.[OrderQty]
                    ,inserted.[UnitPrice]
                FROM inserted 
                    INNER JOIN [Purchasing].[PurchaseOrderDetail] 
                    ON inserted.[PurchaseOrderID] = [Purchasing].[PurchaseOrderDetail].[PurchaseOrderID];
    
                -- Update SubTotal in PurchaseOrderHeader record. Note that this causes the 
                -- PurchaseOrderHeader trigger to fire which will update the RevisionNumber.
                UPDATE [Purchasing].[PurchaseOrderHeader]
                SET [Purchasing].[PurchaseOrderHeader].[SubTotal] = 
                    (SELECT SUM([Purchasing].[PurchaseOrderDetail].[LineTotal])
                        FROM [Purchasing].[PurchaseOrderDetail]
                        WHERE [Purchasing].[PurchaseOrderHeader].[PurchaseOrderID] 
                            = [Purchasing].[PurchaseOrderDetail].[PurchaseOrderID])
                WHERE [Purchasing].[PurchaseOrderHeader].[PurchaseOrderID] 
                    IN (SELECT inserted.[PurchaseOrderID] FROM inserted);
    
                UPDATE [Purchasing].[PurchaseOrderDetail]
                SET [Purchasing].[PurchaseOrderDetail].[ModifiedDate] = GETDATE()
                FROM inserted
                WHERE inserted.[PurchaseOrderID] = [Purchasing].[PurchaseOrderDetail].[PurchaseOrderID]
                    AND inserted.[PurchaseOrderDetailID] = [Purchasing].[PurchaseOrderDetail].[PurchaseOrderDetailID];
            END;
        END TRY
        BEGIN CATCH
            EXECUTE [dbo].[uspPrintError];
    
            -- Rollback any active or uncommittable transactions before
            -- inserting information in the ErrorLog
            IF @@TRANCOUNT > 0
            BEGIN
                ROLLBACK TRANSACTION;
            END
    
            EXECUTE [dbo].[uspLogError];
        END CATCH;
    END;
    
    See Also