You are on page 1of 31

.

:
:
.
:

.
:

.

.
.

DML (DELETE, INSERT, UPDATE)


DDL (CREATE, ALTER, DROP)
(LOGON, LOGOFF)

Before
.
y :

,

After

.
y :

,
.
y

.
create,
create alter
alter,
drop
.

index
.

CREATE TRIGGER -trigger

ti
{ INSERT | DELETE | UPDATE } [ OF _ [, _]* ] ON _
REFERENCING
FOR EACH ROW / FOR EACH STATEMENT
MODE DB2ROW / DB2SQL
WHEN ()
BEGIN
trigger
END

REFERENCING
y
y

FOR EACH ROW


y

REFERENCING OLD AS __
REFERENCING NEW AS _NE_

FOR EACH STATEMENT WHEN ()


y

.
WHEN

CREATE TRIGGER SAILORS1


AFTER INSERT ON SAILORS
REFERENCING NEW AS N
FOR EACH ROW MODE DB2SQL
UPDATE SAILORS SET AGE_UPDATED = CURRENT TIMESTAMP
WHERE SID = N.SID

TIMESTAMP
. .

..
2009-03-31 13:15:30:180

10

CREATE TRIGGER SAILORS1


AFTER UPDATE OF sid, age, rating ON SAILORS
REFERENCING NEW AS N
FOR EACH ROW MODE DB2SQL
UPDATE SAILORS SET AGE_UPDATED = CURRENT TIMESTAMP
WHERE SID = N.SID

11

CREATE TRIGGER SALARY_TRACK


AFTER UPDATE OF SALARY ON EMPLOYEE
REFERENCING NEW ROW AS NROW OLD ROW AS OROW
FOR EACH ROW MODE DB2SQL
WHEN (NROW
(NROW.SALARY
SALARY < OROW.SALARY)
OROW SALARY)
BEGIN
INSERT INTO SALARY_CTL (EMPNO, NEW_SALARY, OLD_SALARY, UPDATE_TIMESTAMP)
VALUES (NROW.EMPNO, NROW.SALARY, OROW.SALARY, CURRENT TIMESTAMP);
END

12

CREATE FUNCTION func()


f nc()
RETURNS trigger AS
'
begin
new.updated:=now();
return new;
end;
'
LANGUAGE 'plpgsql
plpgsql

now()



.
..
Ti
Time
Date
Timestamp

CREATE TRIGGER trignameB


Before insert on A
For each row execute procedure funcB();
.

14

CREATE OR REPLACE FUNCTION funcA()


RETURNS trigger AS
'
declare curtime timestamp;
begin
curtime := \'now\';
p
= curtime
UPDATE A SET updated
WHERE x = new.x and y = new.y;
return new;
end;
'
LANGUAGE 'plpgsql
CREATE TRIGGER trignameA
after insert on A
For each row execute procedure funcA();

15

PL/pgSQL
trigger procedures.
trigger

ti
procedure
d

CREATE FUNCTION,

.
trigger NULL
/




trigger.


trigger
gg p
procedure

TG_ARGV.

16

PL/pgSQL trigger,
.
y NEW type RECORD

INSERT/UPDATE row- triggers.
NULL statement- triggers DELETE.
y OLD type RECORD

UPDATE/DELETE row- triggers.
NULL statement- triggers INSERT.
INSERT

17

TG_NAME
TG
NAME
trigger
.
TG WHEN
TG_WHEN
BEFORE AFTER trigger.
TG_LEVEL
ROW or STATEMENT trigger.
TG_OP
INSERT, UPDATE, DELETE,
trigger.
TG RELID
TG_RELID
object ID trigger.
TG_TABLE_NAME

trigger.
gg

TG_TABLE_SCHEMA

trigger.

18

CREATE FUNCTION upgradeRating() RETURNS TRIGGER AS '


DECLARE
sid_per_day INTEGER;
BEGIN
SELECT COUNT(*) INTO sid_per_day
sid per day
FROM Reserves
WHERE sid = NEW.sid and day1 = NEW.day1;
IF sid_per_day
sid per day > 5 THEN
UPDATE Sailors
SET rating=rating +1
WHERE sid = NEW.sid;
END IF;
RETURN NULL;
END;
' LANGUAGE plpgsql;
l
l
CREATE TRIGGER upgradeRatingTrigger
AFTER INSERT ON Reserves
FOR EACH ROW
EXECUTE PROCEDURE upgradeRating();

20

CREATE TABLE emp (


empid
p integer
g NOT NULL p
primary
y key,
y,
empname varchar(20),
salary
l
iinteger,
t
last_date
_
timestamp,
p
last_user varchar(20)
);

22

CREATE FUNCTION emp_stamp () RETURNS TRIGGER AS '


BEGIN
-- empname salary
IF NEW.empname ISNULL THEN
RAISE EXCEPTION ''empname cannot be NULL value'';
END IF;;
IF NEW.salary ISNULL THEN
RAISE EXCEPTION ''% cannot have NULL salary'', NEW.empname;
END IF;
--
IF NEW.salary < 0 THEN
RAISE EXCEPTION ''%
% cannot have a negative salary''
salary , NEW.empname;
NEW empname;
END IF;
--
NEW.last_date := ''now'';
NEW.last_user := current_user;
RETURN NEW;
END;
' LANGUAGE 'plpgsql';

23

CREATE TRIGGER emp_stamp BEFORE INSERT OR UPDATE ON emp


FOR EACH ROW EXECUTE PROCEDURE emp_stamp();
insert into emp(empid,
p( p , salary)
y) values (1,
( , 100);
);
ERROR: empname cannot be NULL value
SQL state: P0001
insert into emp(empid, empname) values (2, 'George');
ERROR: George cannot have NULL salary
SQL state: P0001
insert into emp(empid,
emp(empid empname,salary)
empname salary) values (3
(3, 'George'
George , -100);
100);
ERROR: George cannot have a negative salary
SQL state: P0001
insert into emp(empid, empname,salary) values (4, 'George', 100);
Queryy returned successfully:
y 1 rows affected, 0 ms execution time.

24

CREATE TABLE emp2 (


empname varchar(20) NOT NULL primary key,
salary
integer
);

CREATE TABLE emp_audit(


operation
p
char(1)
( ) NOT NULL,,
stamp
timestamp NOT NULL primary key,
userid
varchar(20)
NOT NULL,
empname varchar(20)
NOT NULL,
salary
integer
);

O Log
File

26

CREATE OR REPLACE FUNCTION process_emp_audit()


RETURNS TRIGGER AS $$
BEGIN
--- Create a row in emp_audit to reflect the operation performed on emp2,
-- make use of the special variable TG_OP to work out the operation.
-IF (TG_OP = 'DELETE') THEN
INSERT INTO emp_audit
dit SELECT 'D'
'D', now(),
() user, OLD
OLD.*;
*
RETURN OLD;
ELSIF (TG_OP = 'UPDATE') THEN
INSERT INTO emp_audit
emp audit SELECT 'U'
U , now(),
now() user,
user NEW
NEW.*;;
RETURN NEW;
ELSIF (TG_OP = 'INSERT') THEN
INSERT INTO emp
p_audit SELECT 'I',, now(),
(), user,, NEW.*;;
RETURN NEW;
END IF;
RETURN NULL; -- result is ignored since this is an AFTER trigger
END;
END
$$
LANGUAGE plpgsql;

27

CREATE TRIGGER emp


p_audit
AFTER INSERT OR UPDATE OR DELETE ON emp2
FOR EACH ROW EXECUTE PROCEDURE process_emp_audit();

28

insert into emp2(empname


emp2(empname, salary) values ('John'
('John', 10000);
insert into emp2(empname,
p ( p
, salary)
y) values ('Maria',
(
, 10000);
);
delete from emp2
where
h
empname = 'Maria';
'M i '
update emp2
set salary = salary * 1.1
where empname = 'John';

29

30


.
y

.
.

31

You might also like