Triggernotes Merged
Triggernotes Merged
Ashikur Rahman
CSE, BUET
• You can create only BEFORE and AFTER triggers for tables. (INSTEAD OF triggers
are only available for views; typically they are used to implement view updates.)
• You may specify up to three triggering events using the keyword OR. Furthermore,
UPDATE can be optionally followed by the keyword OF and a list of attribute(s) in
<table_name>. If present, the OF clause defines the event to be only an update of the
attribute(s) listed after OF. Here are some examples:
... INSERT ON R ...
... INSERT OR DELETE OR UPDATE ON R ...
... UPDATE OF A, B OR INSERT ON R ...
– The special variables NEW and OLD are available to refer to new and old tuples re-
spectively. Note: In the trigger body, NEW and OLD must be preceded by a colon
(”:”), but in the WHEN clause, they do not have a preceding colon! See example
below.
– The REFERENCING clause can be used to assign aliases to the variables NEW and
OLD.
– A trigger restriction can be specified in the WHEN clause, enclosed by parentheses.
The trigger restriction is a SQL condition that must be satisfied in order for Oracle
to fire the trigger. This condition cannot contain subqueries. Without the WHEN
clause, the trigger is fired for each row.
1
• <trigger_body> is a PL/SQL block, rather than sequence of SQL statements. Oracle
has placed certain restrictions on what you can do in <trigger_body>, in order to avoid
situations where one trigger performs an action that triggers a second trigger, which then
triggers a third, and so on, which could potentially create an infinite loop. The restrictions
on <trigger_body> include:
– You cannot modify the same relation whose modification is the event triggering the
trigger.
– You cannot modify a relation connected to the triggering relation by another con-
straint such as a foreign-key constraint.
2 Trigger Example
We illustrate Oracle’s syntax for creating a trigger through an example based on the following
two tables:
CREATE TABLE T4 (a INTEGER, b CHAR(10));
CREATE TABLE T5 (c CHAR(10), d INTEGER);
We create a trigger that may insert a tuple into T5 when a tuple is inserted into T4. Specifically,
the trigger checks whether the new tuple has a first component 10 or less, and if so inserts the
reverse tuple into T5:
CREATE TRIGGER trig1
AFTER INSERT ON T4
REFERENCING NEW AS newRow
FOR EACH ROW
WHEN (newRow.a <= 10)
BEGIN
INSERT INTO T5 VALUES(:newRow.b, :newRow.a);
END;
\
Copy the above code in a sqlplus terminal, this will cuase the trigger to be run. However,
running the CREATE TRIGGER statement only creates the trigger; it does not execute the trigger.
Only a triggering event, such as an insertion into T4 in this example, causes the trigger to
execute.
2
4 Dropping Triggers
To drop a trigger:
drop trigger <trigger_name>;
5 Disabling Triggers
To disable or enable a trigger:
alter trigger <trigger_name> {disable|enable};
• A row-level trigger must not query or modify a mutating table. (Of course, NEW and
OLD still can be accessed by the trigger.)
3
• A statement-level trigger must not query or modify a mutating table if the trigger is fired
as the result of a CASCADE delete.
Acknowledgement
Part of this document was taken from the document written originally for Prof. Jeff Ullman’s
CS145 class in Autumn, 1997.
4
CSE 303 Database Ashikur Rahman
Triggers
CREATE [OR REPLACE ] TRIGGER trigger_name
{BEFORE | AFTER}
{INSERT [OR] | UPDATE [OR] | DELETE}
[OF col_name]
ON table_name
[REFERENCING OLD AS o NEW AS n]
[FOR EACH ROW]
WHEN (condition)
BEGIN
Executable-statements
END;
CSE 303 Database Ashikur Rahman