français IV/AP quiz tomorrow on trigger write oui or no depending on trigger 15
How to Write a DML Trigger
description
Transcript of How to Write a DML Trigger
![Page 1: How to Write a DML Trigger](https://reader036.fdocuments.net/reader036/viewer/2022062501/56815d11550346895dcb11da/html5/thumbnails/1.jpg)
drsql.org
How to Write a DML Trigger
Louis Davidsondrsql.org
![Page 2: How to Write a DML Trigger](https://reader036.fdocuments.net/reader036/viewer/2022062501/56815d11550346895dcb11da/html5/thumbnails/2.jpg)
drsql.org
2
Agenda
• Introduction• Trigger Coding Review• Designing a Trigger Solution• Summary
![Page 3: How to Write a DML Trigger](https://reader036.fdocuments.net/reader036/viewer/2022062501/56815d11550346895dcb11da/html5/thumbnails/3.jpg)
drsql.org
Attention: There Is Homework(lots of it)
• I can’t teach you everything about DML triggers in 1 hour• There is a plethora of code the
comes with the download• It will get you started, but is
only just the tip of the iceberg
![Page 4: How to Write a DML Trigger](https://reader036.fdocuments.net/reader036/viewer/2022062501/56815d11550346895dcb11da/html5/thumbnails/4.jpg)
drsql.org
INTRODUCTIONA basic introduction to trigger concepts
![Page 5: How to Write a DML Trigger](https://reader036.fdocuments.net/reader036/viewer/2022062501/56815d11550346895dcb11da/html5/thumbnails/5.jpg)
drsql.org
5
What are DML Triggers?
• Coded modules that are very similar to stored procedures–Cannot be called directly–“Triggered” by an INSERT, UPDATE, or DELETE–With “special” tables to access event data
• Triggers existed in Microsoft SQL Server 1.0 (far before check constraints!)
![Page 6: How to Write a DML Trigger](https://reader036.fdocuments.net/reader036/viewer/2022062501/56815d11550346895dcb11da/html5/thumbnails/6.jpg)
drsql.org
6
DML Trigger Execution• Execute once per DML statement– Access the current state using INSERTED virtual object, removed rows via DELETED (Updates via both)– Work very well on limited cardinality, OLTP-esque types of modifications
• Should not seen and not heard unless they find something wrong– Don’t return results from triggers
• 2005-Later has “disallow results from triggers” server configuration• Ability to do so will be removed in an upcoming SQL Server version
– Caveat: returning results can be effective for debugging• Execute as part of the operation statement/transaction – ROLLBACK in the trigger will stop the operation (and anything else that is part of the current
transaction)– RAISERROR/THROW in trigger will make the transaction non-commitable
• Can use EXECUTE AS to elevate the permissions of the trigger code similar to stored procedures– Only in extreme circumstances!
![Page 7: How to Write a DML Trigger](https://reader036.fdocuments.net/reader036/viewer/2022062501/56815d11550346895dcb11da/html5/thumbnails/7.jpg)
drsql.org
7
DML Triggers – Two types• INSTEAD OF – When an INSERT, UPDATE or DELETE occurs, instead of the
typical code executed, the trigger executes instead. You have to code the effective INSERT, UPDATE or DELETE .– They are the first thing executed–Can be applied to view objects
• AFTER – When an INSERT, UPDATE or DELETE occurs, the typical operation occurs, and then the coded object executes after everything else.
• The use cases for each are different, which we will cover in a bit more detail later when we discuss designing a trigger solution
![Page 8: How to Write a DML Trigger](https://reader036.fdocuments.net/reader036/viewer/2022062501/56815d11550346895dcb11da/html5/thumbnails/8.jpg)
drsql.org
8
Multiple Triggers
• INSTEAD OF - Each table can have only 1 for each of the operations (Maximum of 3, for INSERT, UPDATE, DELETE)• AFTER–You can have “any” number of after triggers–You can only control the first and last trigger for an operation using
sp_settriggerorder
• Caution: More triggers is not necessarily more better
![Page 9: How to Write a DML Trigger](https://reader036.fdocuments.net/reader036/viewer/2022062501/56815d11550346895dcb11da/html5/thumbnails/9.jpg)
drsql.org
TRIGGER CODING TEMPLATE OVERVIEW
The framework to start a trigger with…
![Page 10: How to Write a DML Trigger](https://reader036.fdocuments.net/reader036/viewer/2022062501/56815d11550346895dcb11da/html5/thumbnails/10.jpg)
drsql.org
This session is not entitled:
How to Write DML Triggers To Implement all of your Data
Integrity Needsfor a reason…
![Page 11: How to Write a DML Trigger](https://reader036.fdocuments.net/reader036/viewer/2022062501/56815d11550346895dcb11da/html5/thumbnails/11.jpg)
drsql.org
11
Triggers are…
• Harder to get right than normal DDL solutions• Slower to operate than normal DDL solutions• Harder to support than normal DDL solutions
• Sometimes all we have to work with and then very very useful–Because what do customers care about?
![Page 12: How to Write a DML Trigger](https://reader036.fdocuments.net/reader036/viewer/2022062501/56815d11550346895dcb11da/html5/thumbnails/12.jpg)
drsql.org
12
Top Issues with Database Implementations
• #2 - Tie –Performance –Usability
• #1 Data Quality
• Anything we can do to protect the quality of the data worth the effort (and COST)• Every tool we have in SQL Server for data integrity has at least
some use
![Page 13: How to Write a DML Trigger](https://reader036.fdocuments.net/reader036/viewer/2022062501/56815d11550346895dcb11da/html5/thumbnails/13.jpg)
drsql.org
TRIGGER CODING REVIEWWhat makes triggers different from stored procedures
![Page 14: How to Write a DML Trigger](https://reader036.fdocuments.net/reader036/viewer/2022062501/56815d11550346895dcb11da/html5/thumbnails/14.jpg)
drsql.org
17
Core Trigger Validation Patterns• Negative – Look for any bad row
IF EXISTS ( SELECT * FROM INSERTED WHERE DataIsBad = 1) THROW 50000, N'bad data exists',1;
• Positive – Count that all modified rows are correct DECLARE @rowcount1 = ( SELECT count(*) FROM INSERTED WHERE DataIsBad IS NULL…) DECLARE @rowcount2 = ( SELECT count(*) FROM INSERTED WHERE DataIsBad = 0) IF @rowsAffected <> @rowcount1 + @rowcount2 THROW 50000, N'try again!',1;
– Typical use case will include an INNER JOIN to INSERTED
![Page 15: How to Write a DML Trigger](https://reader036.fdocuments.net/reader036/viewer/2022062501/56815d11550346895dcb11da/html5/thumbnails/15.jpg)
drsql.org
18
Core Trigger Modifications• Basically just executing a DML statement
• Cascading operationsDELETE TableName --likely other than the triggered oneFROM Schema.TablenameWHERE EXISTS (SELECT *
FROM DELETED WHERE DELETED.Key = TableName.Key)
• Instead of Trigger ModificationsINSERT INTO TableName (Key, Column1, RowLastModifiedTime)SELECT Key, UPPER(Column1), SYSDATETIME()FROM INSERTED
![Page 16: How to Write a DML Trigger](https://reader036.fdocuments.net/reader036/viewer/2022062501/56815d11550346895dcb11da/html5/thumbnails/16.jpg)
drsql.org
19
Core Trigger Modifications• AuditingINSERT INTO TableName_AUDIT (Operation, Key,Column1, RowLastModifiedTime, AuditTime)SELECT 'UPDATE',Key, Column1, RowLastModifiedTime, SYSDATETIME()FROM DELETED
• Error handling is managed by the TRY…CATCH block around all of the modification (and validation code)
![Page 17: How to Write a DML Trigger](https://reader036.fdocuments.net/reader036/viewer/2022062501/56815d11550346895dcb11da/html5/thumbnails/17.jpg)
drsql.org
20
Trigger Nesting/Recursion• When you execute a DML statement in a trigger, by default (and the most typical setting)– The trigger will nest (INSERT trigger on table A updates a row in table A and inserts a row into
table B would cause an update trigger on table A and an INSERT trigger on table B to fire if they existed)
– The trigger will not recurse (INSERT trigger on table A inserts a row into table A will not cause the trigger to refire)
• Two settings affect these conditions (with the default values)– exec sp_configure 'nested triggers',1;– alter database <DatabaseName>
set recursive_triggers off;
• There is a demo of changing this behavior in the downloads. These settings are dangerous because they can change behavior without changing code!
![Page 18: How to Write a DML Trigger](https://reader036.fdocuments.net/reader036/viewer/2022062501/56815d11550346895dcb11da/html5/thumbnails/18.jpg)
drsql.org
21
Determining Columns Modified
• Use the UPDATE function– IF UPDATE(<columnName>) --Means the column was referenced in the
statement• Example:
UPDATE table1SET column1 = column1 --,column2 = column2–UPDATE(column1) -> TRUE (even though no change)–UPDATE (column2) -> FALSE
![Page 19: How to Write a DML Trigger](https://reader036.fdocuments.net/reader036/viewer/2022062501/56815d11550346895dcb11da/html5/thumbnails/19.jpg)
drsql.org
22
Trigger Coding Basic Demo Setup
• Understanding multi-row operations• Error Handling
![Page 20: How to Write a DML Trigger](https://reader036.fdocuments.net/reader036/viewer/2022062501/56815d11550346895dcb11da/html5/thumbnails/20.jpg)
drsql.org
TRIGGER CODINGBASICS (DEMO)
Demonstrating the essential trigger coding techniques…
![Page 21: How to Write a DML Trigger](https://reader036.fdocuments.net/reader036/viewer/2022062501/56815d11550346895dcb11da/html5/thumbnails/21.jpg)
drsql.org
DESIGNING A TRIGGER
Making sure you understand what needs to be handled by the trigger before you start coding.
![Page 22: How to Write a DML Trigger](https://reader036.fdocuments.net/reader036/viewer/2022062501/56815d11550346895dcb11da/html5/thumbnails/22.jpg)
drsql.org
25
Designing a Trigger
• When using constraints, there will always be a single object needed to do the entire job–Check Constraint–Foreign Key
• When building a trigger, you have to cover:–All tables that are involved with the process–All operations that might be involved• INSERT• UPDATE• DELETE
![Page 23: How to Write a DML Trigger](https://reader036.fdocuments.net/reader036/viewer/2022062501/56815d11550346895dcb11da/html5/thumbnails/23.jpg)
drsql.org
26
Choosing the type of trigger to use – AFTER
• Typically used for validation and non-destructive cascading operations• Allow you to check the effects of the DML statement–You can see the state of database after the operation
• Examples–Audit Trails that work on any edition of SQL Server– Inter-row/Inter-table data validations, such as foreign keys/range
overlapping, where constraints will not work–Summary data (where heavily tested and determined to be necessary)
![Page 24: How to Write a DML Trigger](https://reader036.fdocuments.net/reader036/viewer/2022062501/56815d11550346895dcb11da/html5/thumbnails/24.jpg)
drsql.org
27
Choosing the type of trigger to use – INSTEAD OF
• Typically used to change the operation in some manner, either lightly or dramatically• Also for cascade operations to avoid RI errors, like a cascade delete• Examples–Overriding format of data (formatting input, overriding user input, such as a
date and time)– Ignoring/logging for review “bad” data (high speed data entry, instrument
data)–Making multi-table views updatable using simple T-SQL–Turning a physical delete into a logical delete – …set deletedFlag = 1
![Page 25: How to Write a DML Trigger](https://reader036.fdocuments.net/reader036/viewer/2022062501/56815d11550346895dcb11da/html5/thumbnails/25.jpg)
drsql.org
28
Scenario Introduction
Let’s look at 3 basic scenarios1. Maintaining a row inserted and updated time on a row2. Preventing a negative balance3. Managing an audit trail
Note: in all of these cases, the requirement we will use will be that the logic cannot be overridden.
![Page 26: How to Write a DML Trigger](https://reader036.fdocuments.net/reader036/viewer/2022062501/56815d11550346895dcb11da/html5/thumbnails/26.jpg)
drsql.org
29
Maintaining a row inserted and updated time on a row
Table Involved
Table1 (Table1Key, RowCreatedTime, RowLastModifyTime)
Row Inserted
Row Updated
Row Deleted
Type of triggers: INSTEAD OF
![Page 27: How to Write a DML Trigger](https://reader036.fdocuments.net/reader036/viewer/2022062501/56815d11550346895dcb11da/html5/thumbnails/27.jpg)
drsql.org
30
Preventing a Negative BalanceTables Involved
Parent Table(ParentId (not changeable), ChildValueSum (not stored))
Child Table (ChildId, ParentId FK, Value)
Row Inserted Row Inserted
Row Updated Row Updated
Row Deleted Row Deleted
Type of triggers: AFTER
![Page 28: How to Write a DML Trigger](https://reader036.fdocuments.net/reader036/viewer/2022062501/56815d11550346895dcb11da/html5/thumbnails/28.jpg)
drsql.org
31
Managing an audit trailTable Involved
Table1 (Table1Key, RowCreatedTime, RowLastModifyTime)
Row Inserted
Row Updated
Row Deleted
Type of triggers: AFTER
![Page 29: How to Write a DML Trigger](https://reader036.fdocuments.net/reader036/viewer/2022062501/56815d11550346895dcb11da/html5/thumbnails/29.jpg)
drsql.org
PRE-DEMO SUMMARY, IN CASE TIME IS NIGHTriggers are equal parts friend and foe
![Page 30: How to Write a DML Trigger](https://reader036.fdocuments.net/reader036/viewer/2022062501/56815d11550346895dcb11da/html5/thumbnails/30.jpg)
drsql.org
TRIGGER DESIGN AND CODING SCENARIOS
Code review …
![Page 31: How to Write a DML Trigger](https://reader036.fdocuments.net/reader036/viewer/2022062501/56815d11550346895dcb11da/html5/thumbnails/31.jpg)
drsql.org
ADVANCED TOPICSSettings and metadata to fully understand trigger operation
Note: This section may not be achievable in a 90 minute session but will be available to download with examples
![Page 32: How to Write a DML Trigger](https://reader036.fdocuments.net/reader036/viewer/2022062501/56815d11550346895dcb11da/html5/thumbnails/32.jpg)
drsql.org
35
Advanced Topics To Cover (Demos)• Getting trigger metadata - queries• Multiple triggers of the same type on the same table and ordering• Trigger Nesting/Recursion• System Settings - can change trigger execution without changing code– sp_serveroption— nested triggers (default ON)– Determines if a DML statement from
one trigger causes other DML triggers to be executed– database option—RECURSIVE_TRIGGERS (default OFF)– Determines if an update on the
table where the trigger fired causes the same triggers to fire again– sp_serveroption–disallow results from triggers (default OFF): Turn this setting on will
ensure that any trigger that tries to return data to the client will get an error – sp_serveroption-server trigger recursion (default ON) – Determines if DDL in a server DDL
trigger causes it to fire again
![Page 33: How to Write a DML Trigger](https://reader036.fdocuments.net/reader036/viewer/2022062501/56815d11550346895dcb11da/html5/thumbnails/33.jpg)
drsql.org
ADVANCED TOPICS (DEMO)
Coded examples showing some advanced trigger concerns
![Page 34: How to Write a DML Trigger](https://reader036.fdocuments.net/reader036/viewer/2022062501/56815d11550346895dcb11da/html5/thumbnails/34.jpg)
drsql.org
37
Conclusion
• Triggers are no one’s favorite tool• They are sneaky and tend to complicate support, testing,
maintenance, etc• But that sneakiness makes them powerful
• Use sparingly, whenever necessary
![Page 35: How to Write a DML Trigger](https://reader036.fdocuments.net/reader036/viewer/2022062501/56815d11550346895dcb11da/html5/thumbnails/35.jpg)
drsql.org
38
Questions? Contact info..
• Louis Davidson - [email protected]• Website – http://drsql.org Get slides here• Twitter – http://twitter.com/drsql
• SQL Blog http://sqlblog.com/blogs/louis_davidson
• Simple Talk Blog – What Counts for a DBAhttp://www.simple-talk.com/community/blogs/drsql/default.aspx