How DML triggers are used

Building and Optimizing Triggers in SQL Server

Florin Angelescu

Instructor

Why should we use DML triggers?

  • Initiating actions when manipulating data
  • Preventing data manipulation
  • Tracking data or database object changes
  • User auditing and database security
Building and Optimizing Triggers in SQL Server

Deciding between AFTER and INSTEAD OF

CREATE TRIGGER MyFirstAfterTrigger
ON Table1
-- Triggered after 
-- the firing event (UPDATE)
AFTER UPDATE
AS
{trigger_actions_section};
CREATE TRIGGER MyFirstInsteadOfTrigger
ON Table2
-- Triggered instead of 
-- the firing event (UPDATE)
INSTEAD OF UPDATE
AS
{trigger_actions_section};
Building and Optimizing Triggers in SQL Server

Deciding between AFTER and INSTEAD OF

AFTER trigger

Initial event fires the trigger

Initial event executes

The trigger actions execute

How an AFTER Trigger Works

INSTEAD OF trigger

Initial event fires the trigger

Initial event is not executed anymore

The trigger actions execute

How an INSTEAD OF Trigger Works

Building and Optimizing Triggers in SQL Server

AFTER trigger usage example

  • Data is inserted into a sales table
  • Start a data cleansing procedure
  • Generate a table report with the procedure results
  • Notify the database administrator
CREATE TRIGGER SalesNewInfoTrigger
ON Sales
AFTER INSERT
AS

EXEC sp_cleansing @Table = 'Sales';
EXEC sp_generateSalesReport;
EXEC sp_sendnotification;
Building and Optimizing Triggers in SQL Server

INSTEAD OF trigger usage example

| Brand | Model    | Power | Stock |
|-------|----------|-------|-------|
| Ecco  | Standard | 30W   | 30    |
| Miry  | Buma     | 45W   | 0     |
| Lume  | Ultra    | 50W   | 0     |
  • The power changes for some models
CREATE TRIGGER BulbsStockTrigger
ON Bulbs
INSTEAD OF INSERT
AS
Building and Optimizing Triggers in SQL Server

INSTEAD OF trigger usage example

| Brand | Model    | Power | Stock |
|-------|----------|-------|-------|
| Ecco  | Standard | 30W   | 30    |
| Miry  | Buma     | 50W   | 100   |
| Lume  | Ultra    | 52W   | 100   |
  • The power changes for some models
  • Update only the products with no stock
CREATE TRIGGER BulbsStockTrigger
ON Bulbs
INSTEAD OF INSERT
AS

IF EXISTS (SELECT * FROM Bulbs AS b INNER JOIN inserted AS i ON b.Brand = i.Brand AND b.Model = i.Model WHERE b.Stock = 0) BEGIN UPDATE b SET b.Power = i.Power, b.Stock = i.Stock FROM Bulbs AS b INNER JOIN inserted AS i ON b.Brand = i.Brand AND b.Model = i.Model WHERE b.Stock = 0 END
Building and Optimizing Triggers in SQL Server

INSTEAD OF trigger usage example

| Brand | Model    | Power | Stock |
|-------|----------|-------|-------|
| Ecco  | Standard | 30W   | 30    |
| Miry  | Buma     | 50W   | 100   |
| Lume  | Ultra    | 52W   | 100   |
| Ecco  | Standard | 35W   | 100   |
  • The power changes for some models
  • Update only the products with no stock
  • Add new rows for the products with stock
-- First part was truncated for spacing reasons
IF EXISTS (SELECT * FROM Bulbs AS b
INNER JOIN inserted AS i
           ON b.Brand = i.Brand
          AND b.Model = i.Model
WHERE b.Stock = 0)
BEGIN
    UPDATE b
    SET b.Power = i.Power,
        b.Stock = i.Stock
    FROM Bulbs AS b
    INNER JOIN inserted AS i
                ON b.Brand = i.Brand
                  AND b.Model = i.Model
    WHERE b.Stock = 0
END
ELSE
    INSERT INTO Bulbs
    SELECT * FROM inserted;
Building and Optimizing Triggers in SQL Server

Practice questions

Building and Optimizing Triggers in SQL Server

Preparing Video For Download...