Northwind Database (Document! X Sample)
AdventureWorks Database / Sales Schema / Sales.SalesOrderDetail Table / iduSalesOrderDetail Trigger
In This Topic
    iduSalesOrderDetail Trigger
    In This Topic
    Description
    AFTER INSERT, DELETE, UPDATE trigger that inserts a row in the TransactionHistory table, updates ModifiedDate in SalesOrderDetail and updates the SalesOrderHeader.SubTotal column.
    Properties
    Creation Date27/10/2017 14:33
    Encrypted
    Ansi Nulls
    Trigger Type
    Insert Delete Update After Instead Of
    Trigger Definition
    CREATE TRIGGER [Sales].[iduSalesOrderDetail] ON [Sales].[SalesOrderDetail] 
    AFTER INSERT, DELETE, UPDATE AS 
    
    BEGIN
        DECLARE @Count int;
    
        SET @Count = @@ROWCOUNT;
        IF @Count = 0 
            RETURN;
    
        SET NOCOUNT ON;
    
        BEGIN TRY
            -- If inserting or updating these columns
            IF UPDATE([ProductID]) OR UPDATE([OrderQty]) OR UPDATE([UnitPrice]) OR UPDATE([UnitPriceDiscount]) 
            -- Insert record into TransactionHistory
            BEGIN
                INSERT INTO [Production].[TransactionHistory]
                    ([ProductID]
                    ,[ReferenceOrderID]
                    ,[ReferenceOrderLineID]
                    ,[TransactionType]
                    ,[TransactionDate]
                    ,[Quantity]
                    ,[ActualCost])
                SELECT 
                    inserted.[ProductID]
                    ,inserted.[SalesOrderID]
                    ,inserted.[SalesOrderDetailID]
                    ,'S'
                    ,GETDATE()
                    ,inserted.[OrderQty]
                    ,inserted.[UnitPrice]
                FROM inserted 
                    INNER JOIN [Sales].[SalesOrderHeader] 
                    ON inserted.[SalesOrderID] = [Sales].[SalesOrderHeader].[SalesOrderID];
    
                UPDATE [Person].[Person] 
                SET [Demographics].modify('declare default element namespace 
                    "http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/IndividualSurvey"; 
                    replace value of (/IndividualSurvey/TotalPurchaseYTD)[1] 
                    with data(/IndividualSurvey/TotalPurchaseYTD)[1] + sql:column ("inserted.LineTotal")') 
                FROM inserted 
                    INNER JOIN [Sales].[SalesOrderHeader] AS SOH
                    ON inserted.[SalesOrderID] = SOH.[SalesOrderID] 
                    INNER JOIN [Sales].[Customer] AS C
                    ON SOH.[CustomerID] = C.[CustomerID]
                WHERE C.[PersonID] = [Person].[Person].[BusinessEntityID];
            END;
    
            -- Update SubTotal in SalesOrderHeader record. Note that this causes the 
            -- SalesOrderHeader trigger to fire which will update the RevisionNumber.
            UPDATE [Sales].[SalesOrderHeader]
            SET [Sales].[SalesOrderHeader].[SubTotal] = 
                (SELECT SUM([Sales].[SalesOrderDetail].[LineTotal])
                    FROM [Sales].[SalesOrderDetail]
                    WHERE [Sales].[SalesOrderHeader].[SalesOrderID] = [Sales].[SalesOrderDetail].[SalesOrderID])
            WHERE [Sales].[SalesOrderHeader].[SalesOrderID] IN (SELECT inserted.[SalesOrderID] FROM inserted);
    
            UPDATE [Person].[Person] 
            SET [Demographics].modify('declare default element namespace 
                "http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/IndividualSurvey"; 
                replace value of (/IndividualSurvey/TotalPurchaseYTD)[1] 
                with data(/IndividualSurvey/TotalPurchaseYTD)[1] - sql:column("deleted.LineTotal")') 
            FROM deleted 
                INNER JOIN [Sales].[SalesOrderHeader] 
                ON deleted.[SalesOrderID] = [Sales].[SalesOrderHeader].[SalesOrderID] 
                INNER JOIN [Sales].[Customer]
                ON [Sales].[Customer].[CustomerID] = [Sales].[SalesOrderHeader].[CustomerID]
            WHERE [Sales].[Customer].[PersonID] = [Person].[Person].[BusinessEntityID];
        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