トリガー基礎学習
1.まずトリガーの基本的な文法形式を説明します。
create [or replace] trigger ---
{after|before} ---
{insert or delete or update} ---
of ---
on ---
{referencing ---
old as old_value new as new_value}
{for each row|for each statement} --- ( )
begin
sql ; ---
end;
--for each rowライントリガーは、 の ごとにトリガされます。 えば、delete fromテーブルが100 されたら、100 トリガされます。
--for each statement レベルのトリガー、 えば:delete from tableが100 されたら、 だけトリガされます。
--old_value は、イベント の いデータがある を します。value.フィールド は するフィールド を び します。
--new_value は、イベント の しいデータがある を します。value.フィールド は するフィールド を び します。
2. を いてトリガーを する
(1)ステートメントトリガー。udate、delete、insertなどの に して、ステートメントトリガーを して します。 のデータを するかは ありません。
まずテーブルstudentを します。
create table student (
stu_no number(6),
stu_name varchar2(20),
age number(3),
sex varchar2(10)
);
その 、 のログテーブルを して、ユーザ student_を します。ロゴ:create table student_log(
stu_user varchar(20),
modfiy_time date
);
student に トリガーstu_を します。trig 1は、トリガーによって のユーザおよび を する。create or replace trigger stu_trig1
before insert or update or delete --
on student
begin
insert into student_log values(user,sysdate); -- student_log
end;
studentテーブルにデータを します。
insert into student values('1'、'dwj'、'23'、'male')
student_ログには、 のユーザ と の が されています。
はいくつかの を して、 つの を って の を します。ロゴの に1つのレコードだけ します。これは レベルのトリガーです。
ここにはfor each rowとfor each statementがありません。デフォルトはfor each statementです。
(2) トリガー。 にはfor each row が まれています。before...for each rowにおいて、ユーザーは を ける の を することができる。
トリガーstu_を します。trig 2は、 の を または する 、 が8に しくない 、その を20に します。create trigger stu_trig2
before insert or update
on student
referencing
old as old_value
new as new_value
for each row -- for each row , when
when (new_value.stu_no<>8)
begin
:new_value.age:=20;
end;
ここで を します。 insert into student values('8'、'xxx'、'23'、'female') insert into student values('9'、'zzz'、'23'、'male') udate student set ... where stuノ= の 1 の を する は、stu_NO=8、 stu_に れていません。trig 2、このデータは に されます。 を する 、stu_NO<>8、 stu_に れます。trig 2では、このデータに するageフィールドが20になり、データベースには'23'ではなく'20'が されます。
:
referencing :DML を する の のデフォルトの は:old、 の は:newです。
insert はnewのみです。
delete はただ:old
udate は あります。
referencing はnewとoldをnew_と を えただけです。valueとold_ えないようにするのが です。
(3)instead of
に、 の で できないものを するために われます。 えば、 に づくもう つのビュー でdelete を うことは できない。 の に づくビューは、トリガーなしでは に 、 、 できないので、instead ofトリガーを しなければならない。with check optionで されたビューにinstead of を することはできません。
な :
の と を してスケviewの は、データテーブルへの を します。
--
create table stu(
stu_no number(6),
stu_name varchar2(20)
);
--
create table cour(
s_no number(6),
grade number(4,1)
);
-- , ,
create view sc_view
as
select stu.stu_no,stu_name,grade from stu,cour;
--
insert into sc_view values(5,'lili',85);
-- , 2 。
-- instead of
create trigger sc_view_trig
instead of insert -- instead of before|after
on sc_view --
begin
insert into stu values(:new.stu_no,:new.stu_name);
insert into cour values(:new.stu_no,:new.grade);
end;
--- sc_view insert , , stu_no,stu_name stu , stu_no,grade cour 。
のinsert を すれば、 と の が にデータを できます。
(4)ユーザイベントトリガー
ユーザイベントトリガー(DDLトリガー)は、create、drop、alter、truncateコマンドを すると、 みのDDLトリガーをトリガし、このトリガーは、あるユーザまたはデータベース のすべてのオブジェクトの を するために されます。 create or replace trigger trigger_name
before|after
create|alter|drop|truncate
on schema|database
(5)システムイベントトリガー
startup、shutdown、logon、logoffデータベースの にシステムイベントのトリガーが します。このトリガーはデータベースがいつ じるか、 くか、ユーザーのlogon/logoffの を するために できます。 create or replace trigger trigger_name
before|after startup|shutdown|logon|logoff
on database
--- :on database,
:
:
(shutdown before, startup after)
--
create table time_record(tt_time varchar2(50));
--
create or replace trigger db_shutdown
before shutdown
on database
begin
insert into time_record values('db shutdown'||tochar(sysdate,'yyyy-MM-dd hh:mm:ss'));
end;
--
alter trigger <trigger_name>disable;
alter trigger<trigger_name>enable;
--
, commit/rollback DDL commit, 。