Beruflich Dokumente
Kultur Dokumente
DECLARE
vMsg VARCHAR2(30) := 'Statement Level Trigger Fired';
BEGIN
IF INSERTING THEN
dbms_output.put_line(vMsg || ' When Inserting');
ELSIF UPDATING THEN
dbms_output.put_line(vMsg || ' When Updating');
ELSIF DELETING THEN
dbms_output.put_line(vMsg || ' When Deleting');
1
END IF;
END statement_level;
/
set serveroutput on
Row Level Trigger ... most common usage to provide a surrogate key from a sequence
CREATE OR REPLACE CREATE TABLE t (
TRIGGER rid NUMBER(5),
<trigger_name> col VARCHAR2(3));
[FOLLOWS
<schema.trigger_name>] ALTER TABLE t
[<ENABLE | DISABLE>] ADD CONSTRAINT pk_t
<BEFORE | AFTER> PRIMARY KEY (rid)
<ACTION> OR USING INDEX;
<ACTION> OR
<ACTION> CREATE SEQUENCE seq_t;
[OF
<column_name_list>] CREATE OR REPLACE TRIGGER row_level
ON <table_name> BEFORE INSERT
REFERENCING NEW AS ON t
<synonym> OLD AS FOR EACH ROW
<synonym> PARENT AS
<synonym> BEGIN
FOR EACH ROW SELECT seq_t.NEXTVAL
INTO :NEW.rid
DECLARE FROM dual;
<variable definitions> dbms_output.put_line(:NEW.rid);
BEGIN END row_level;
<trigger_code> /
EXCEPTION
<exception clauses> INSERT INTO row_t (col) VALUES ('A');
END <trigger_name>; INSERT INTO row_t (col) VALUES ('B');
/ INSERT INTO row_t (col) VALUES ('C');
SELECT * FROM t;
DECLARE
vMsg VARCHAR2(30) := 'Row Level Trigger Fired';
BEGIN
dbms_output.put_line(vMsg);
END row_level;
/
set serveroutput on
DECLARE
vMsg VARCHAR2(30) := 'Row Level Trigger Fired';
BEGIN
IF INSERTING THEN
dbms_output.put_line(vMsg || ' On Insert');
ELSIF UPDATING THEN
dbms_output.put_line(vMsg || ' On Update');
ELSIF DELETING THEN
dbms_output.put_line(vMsg || ' On Delete');
END IF;
END statement_level;
/
set serveroutput on
UPDATE orders
SET somecolumn = 'ZZT';
DECLARE
vMsg VARCHAR2(40) := 'Update Will Change numbercol Column';
BEGIN
dbms_output.put_line(vMsg);
END of_clause;
/
set serveroutput on
UPDATE orders
SET numbercol = 8;
UPDATE person
SET lname = 'Dangerous';
UPDATE person
SET fname = 'Mark', lname = 'Townsend';
set serveroutput on
4
dbms_output.put_line('B');
END follows_b;
/
Compound triggers allow for writing a single trigger incorporating STATEMENT and ROW LEVEL and
BEFORE and AFTER
CREATE TRIGGER CREATE TABLE test AS
<trigger_name> SELECT table_name, tablespace_name
FOR <triggering_event> FROM user_tables;
ON <table_name>
COMPOUND TRIGGER set serveroutput on
5
END bi_t;
/
desc audit_log
CREATE OR REPLACE
6
TRIGGER
t_autonomous_tx
BEFORE INSERT
ON person
DECLARE
PRAGMA
AUTONOMOUS_TRANSAC
TION;
BEGIN
INSERT INTO audit_log
(chng_when,
commentcol)
VALUES
(SYSDATE, 'Reporting
an error');
COMMIT;
END t_autonomous_tx;
/
CREATE OR REPLACE
TRIGGER t_cascade
AFTER INSERT
ON cascade
BEGIN
INSERT INTO cascade
(testcol)
VALUES
('change');
END t_cascade;
/
The insert into t1 firest the trigger which attempts to count the number of records in t1 ... which is
ambiguous.
CREATE TABLE t1 (x int); CREATE OR REPLACE TRIGGER t_trigger
CREATE TABLE t2 (x int); AFTER INSERT ON t1 FOR EACH ROW
CREATE OR REPLACE
TRIGGER t_trigger
AFTER INSERT
ON t1
FOR EACH ROW
DECLARE
i PLS_INTEGER;
BEGIN SELECT COUNT(*)
SELECT COUNT(*) INTO i
INTO i FROM t1;
FROM t1;
INSERT INTO t2
INSERT INTO t2 VALUES
VALUES (i);
(i); COMMIT;
END; END;
/ /
Count on t1 is performed
as though a different user
logged on and asked the
question of t1.
Trigger Enforcing Auditing
CREATE OR REPLACE
TRIGGER t_t2_audit
AFTER UPDATE
ON t2
REFERENCING NEW AS n
OLD AS o
FOR EACH ROW
BEGIN
INSERT INTO changes
VALUES (:n.x, :o.x,
user);
END t_t2_audit;
/
8
UPDATE t2
SET x = 1;
COMMIT;
SELECT * FROM
changes;
Trigger Enforcing Integrity Constraint
DECLARE
bad_date EXCEPTION;
BEGIN
IF :new.datecol >
SYSDATE THEN
RAISE_APPLICATION_ER
ROR(-20005,'Future
Dates Not Allowed');
END IF;
END;
/
CREATE OR REPLACE
9
TRIGGER secure_data
BEFORE INSERT OR
UPDATE OR DELETE
ON orders
FOR EACH ROW
BEGIN
secure_dml(:NEW.datec
ol);
END;
/
10