トリガー基礎学習


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,        。