Building and Optimizing Triggers in SQL Server
Florin Angelescu
Instructor
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};
AFTER trigger
Initial event fires the trigger
Initial event executes
The trigger actions execute
INSTEAD OF trigger
Initial event fires the trigger
Initial event is not executed anymore
The trigger actions execute
CREATE TRIGGER SalesNewInfoTrigger ON Sales AFTER INSERT AS
EXEC sp_cleansing @Table = 'Sales';
EXEC sp_generateSalesReport;
EXEC sp_sendnotification;
| Brand | Model | Power | Stock |
|-------|----------|-------|-------|
| Ecco | Standard | 30W | 30 |
| Miry | Buma | 45W | 0 |
| Lume | Ultra | 50W | 0 |
CREATE TRIGGER BulbsStockTrigger
ON Bulbs
INSTEAD OF INSERT
AS
| Brand | Model | Power | Stock |
|-------|----------|-------|-------|
| Ecco | Standard | 30W | 30 |
| Miry | Buma | 50W | 100 |
| Lume | Ultra | 52W | 100 |
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
| Brand | Model | Power | Stock |
|-------|----------|-------|-------|
| Ecco | Standard | 30W | 30 |
| Miry | Buma | 50W | 100 |
| Lume | Ultra | 52W | 100 |
| Ecco | Standard | 35W | 100 |
-- 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