Professional Documents
Culture Documents
Ch14 Database Trigger
Ch14 Database Trigger
14
14
Database Trigger
Trigger PL/SQL Block stored
subprogram ( procedure, function
package)
DDL
DML
INSERT, UPDATE DELETE
Database
startup shutdown logon logoff
Triggering
Event
trigger
referential integrity
trigger
trigger body trigger
(transparent)
trigger
DML DDL
trigger referential integrity
.
Chap. 14
referential integrity
Database triggers
database triggers
DDL DML
(auditing)
data-integrity relationships
system event
trigger
ALTER TABLE
ALTER ALTER
ANY TABLE
(system privilege) CREATE TRIGGER (
role RESOURCE)
trigger trigger
ALTER ANY TRIGGER
Trigger 2 Database Trigger
Application Trigger
Database Trigger Trigger
INSERT, UPDATE
DELETE (triggering statement)
Database Trigger
View
.
Chap. 14
DML
view trigger base table view
( Database
Trigger )
Application Trigger Trigger
Trigger
database trigger
trigger
Database Trigger
centralized Global operations
triggers
trigger Oracle trigger
integrity
constraints Oracle
trigger
trigger
14.1
Database Trigger (
trigger)
database trigger
audit
Chap. 14
A P P L IC A T I O N
S Q L > IN S E R T IN T O E M P ...,
EMP table
EMPNOENAME JOB
SAL
C H E C K _ S A L _ trig g e r
7838
KING PRESIDENT 5000
7698
BLAKE MANAGER 2850
7369
SMITH CLERK
800
7788
SCOTT ANALYST 3000
trigger
trigger trigger timing, triggering event, trigger
type trigger body
- Trigger timing trigger
(fired)
BEFORE AFTER
trigger
(events) trigger
trigger
logon
- Triggering event data
manipulation trigger
INSERT,
UPDATE DELETE
- Trigger type
trigger body statement
row
- Trigger body
trigger PL/SQL Block
Chap. 14
- BEFORE Trigger
Trigger
trigger
event
event INSERT
UPDATE
- AFTER Trigger
Trigger
trigger
event
BEFORE trigger
- INSTEAD OF
Trigger
trigger
event trigger
view
DML SQL
join
update
trigger INSTEAD OF
Oracle update,
insert delete
(base table)
Trigger
INSERT
DELETE
- Triggering Event
DML
.
Chap. 14
DML
14.1.3
Trigger Type
trigger 2
trigger statement
- Statement Trigger trigger
event
event
SQL
SQL> UPDATE emp SET sal = sal * 1.1 WHERE
deptno = 30;
row trigger
WHERE
trigger time
triger type
BEFORE INSERT row
BEFORE INSERT statement
AFTER INSERT row
AFTER INSERT statement
BEFORE UPDATE row
BEFORE UPDATE statement
.
Chap. 14
trigger
14.2
Statement Trigger
Statement Trigger
Chap. 14
emp
Oracle Server roll back
RAISE_APPLICATION_ERROR
SQL> CREATE OR REPLACE TRIGGER
secure_emp
BEFORE INSERT ON emp
BEGIN
IF (TO_CHAR (sysdate, DY) IN (SAT,
SUN)) OR
(TO_CHAR(sysdate, HH24) NOT
BETWEEN 08 AND 18 ) THEN
RAISE_APPLICATION_ERROR (-20500,
You may only insert into EMP
during normal hours.);
END IF;
END;
/
EMP
(fire)
trigger
SQL*Plus
SQL> INSERT INTO EMP (empno, ename, deptno)
VALUES (7777, 'BAUWENS', 40);
INSERT INTO EMP (empno, ename, deptno)
VALUES (7777, 'BAUWENS', 40)
*
ERROR at line 1:
ORA-20500: You may only insert into EMP during
normal hours.
ORA-06512: at "SCOTT.SECURE_EMP", line 4
.
Chap. 14
Chap. 14
20500,
10
normal hours.);
END IF;
END;
/
AFTER
trigger
update sal
emp update
Chap. 14
11
/
AUDIT_TABLE
USER_N TABLEN COLUMN_N IN UP DE MAX_I MAX_U MAX_D
AME
AME
AME
S D L NS
PD
EL
SCOTT
EMP
SCOTT
EMP
JONES
EMP
14.3
1 1
1 5
SAL
5
0 0
0 5
Row Trigger
Row Trigger
CREATE [OR REPLACE] TRIGGER trigger_name
timing event1 [ OR event2 OR event3]
ON table_name
[REFERENCING OLD AS old | NEW AS new
FOR EACH ROW
[WHEN condition]
PL/SQL block;
trigger_name trigger
timing BEFORE, AFTER
event data manipulation event
INSERT, UPDATE [OF column]
DELETE
table_name
PL/SQL block triggering body
REFERENCING
default NEW OLD
FOR EACH ROW trigger
row trigger
WHEN
trigger body
Chap. 14
12
Chap. 14
13
EMP
OLD NEW
Data
Operatio
n
INSERT
UPDATE
DELETE
Old Value
New Value
NULL
Value before
update
Value before
update
Inserted value
Value after
update
NULL
ROW Trigger
Chap. 14
14
- ( : )
Chap. 14
15
Chap. 14
16
exception handling
SQL
rolled back trigger
integrity constraints
trigger
trigger
- primary key,
foreign key, Unique key
constraining table
- mutating
table
constraining table
triggering event
constraining table
DEPTNO DEPT
parent table cascading update
EMP
run time error
Chap. 14
17
Chap. 14
cascading_updates
constraining table
mutating table
UPDATE,
DELETE INSERT
DELETE
CASCADE referential integrity
STATEMENT Trigger
mutating table
triggered table
FOREIGN KEY constraint
mutating table trigger
mutating table
row trigger
inconsistent
Trigger CHECK_SALARY
EMP
18
Chap. 14
19
RAISE_APPLICATION_ERROR(-20505,
Out of range);
END IF;
END;
/
SQL
SQL> UPDATE emp SET sal = 1500 WHERE
ename = SMITH;
runtime error
EMP mutating table trigger
14.6
Triggers
trigger
Oracle server
- Security: Oracle server
user role trigger
Chap. 14
20
trigger
14.6.1 Security
Oracle server
schemas role
schema
SQL> GRANT SELECT, INSERT, UPDATE, DELETE
ON emp
TO CLERK
-- database roles
SQL> GRANT CLERK TO SCOTT;
trigger
.
Chap. 14
21
14.6.2 Auditing
audit Oracle server
AUDIT auditing feature
enable DBA
audit trial audit table
data dictionary views
.
Chap. 14
22
USER_AUDIT_OBJECT, USER_AUDIT_SESSION,
USER_AUDIT_STATEMENT
AUDIT
Oracle
emp 500
SQL
SQL> ALTER TABLE emp ADD CONSTRAINT
ck_salary CHECK (sal >= 500);
trigger
10 %
SQL> CREATE OR REPLACE TRIGGER
check_salary
BEFORE UPDATE OF sal ON emp
FOR EACH ROW
WHEN (new.sal < old.sal) OR (new.sal >
old.sal * 1.1)
BEGIN
RAISE_APPLICATION_ERROR(-20508,
Do not decrease nor increase by
more than 10%.);
END;
cascading delete
.
Chap. 14
23
delete
null default
trigger DEPTNO
DEPT
EMP (- trigger
referential integrity
EMP DEPT
)
SQL> CREATE OR REPLACE TRIGGER
cascade_updates
AFTER UPDATE OF deptno ON dept
FOR EACH ROW
BEGIN
UPDATE emp SET emp.deptno =
:new.deptno
WHERE emp.deptno = :old.deptno;
END;
/
14.6.5
Table Replication
SQL
SQL> UPDATE dept
SET total_sal = (SELECT SUM(salary)
FROM emp WHERE
emp.deptno = dept.deptno);
TOTAL_SALARY DEPT
.
Chap. 14
trigger
real time (synchronously)
24
Chap. 14
25
e-mail trigger
(transparently)
trigger
Chap. 14
26
DBMS_MAIL.send(Invemtory,
user, null, null, Low Inventory,
null, v_msg_text);
END;
/
CHR(10) carriage return
14.7
trigger (Enabling
and Disabling Trigger)
trigger
(enable)
trigger (disable)
trigger
trigger
alter trigger enable
Chap. 14
27
Trigger
Ledger
Chap. 14
28
1
Amount 10
% ledger trigger
(row level trigger) BEFORE UPDATE
Amount
10
new
old
CREATE TRIGGER ledger_bef_upd_row
BEFORE UPDATE ON ledger
FOR EACH ROW
WHEN (NEW.Amount / OLD.Amount > 1.1)
BEGIN
INSERT INTO ledger _audit
VALUES ( :old.ActionDate, :old.Action,
:old.Item, :old.Quantity,
:old.QuantityType, :old.Rate,
:old.Amount, :old.Person);
END;
trigger BEGIN
END
UPDATE ledger
WHEN
ledger ledger_audit
trigger ledger_audit
trigger
roles
NEW
OLD PL/SQL
colon ( : )
1
ledger
.
Chap. 14
29
ledger_audit trigger
ledger_audit
ledger triger INSTEAD OF
trigger INSTEAD OF
ledger
trigger insert, update
delete
trigger
trigger
2 trigger
INSERT UPDATE
UPDATE trigger
Amount
if (insert
update)
CREATE TRIGGER ledger_bef_upd_ins_row
BEFORE INSERT OR UPDATE OF Amount ON
ledger
FOR EACH ROW
BEGIN
IF INSERTING THEN
INSERT INTO ledger_audit
VALUES ( :new.ActionDate, :new.Action,
:new.Item, :new.Quantity,
:new.QuantityType, :new.Rate,
:new.Amount, :new.Person);
ELSE
-- if not inserting, then we are
updating Amount
INSERT INTO ledger_audit
VALUES ( :old.ActionDate, :old.Action,
:old.Item, :old.Quantity,
.
Chap. 14
30
:old.QuantityType, :old.Rate,
:old.Amount, :old.Person);
END IF;
END;
trigger
IF
INSERTING,
DELETING UPDATING
trigger
INSERT UPDATE
ledger
UPPER(Person)
( UpperPerson)
derived data
Person
UPPER(Person)
NULL
trigger
trigger BEFORE INSERT BEFORE UPDATE
3
CREATE TRIGGER ledger_bef_upd_ins_row
BEFORE INSERT OR UPDATE OF Person ON
ledger
FOR EACH ROW
BEGIN
:new.UpperPerson := :new.Person;
END;
trigger
.
Chap. 14
31
RAISE_APPLICATION_ERROR
trigger
4 trigger
(statement level trigger) BEFORE DELETE
ledger
DELETE
trigger
(username)
FIN
CREATE TRIGGER ledger_bef_del
BEFORE DELETE ON ledger
DECLARE
weekend_error EXCEPTION
BEGIN
IF TO_CHAR(Sysdate, DY) = SAT OR
TO_CHAR(Sysdate, DY) = SUN THEN
RAISE weekend_error;
END IF;
IF SUBSTR(User, 1, 3) <> FIN THEN
RAISE not_finance_user;
END IF;
EXCEPTION
WHEN weekend_error THEN
RAISE_APPLICATION_ERROR( -20001,
Deletions not allowed on weekends);
WHEN not_finance_user THEN
RAISE_APPLICATION_ERROR( -20002,
Deletions only allowed by Finance user);
END;
.
Chap. 14
32