11、触发器

  1 一.触发器
  2 分类:
  3 (1)行级触发器:DML,如果操作批量数据,会出现多个影响语句
  4 (2)语句级触发器:DML ,如果操作批量数据,会出现一个影响语句
  5 (3)instead of 触发器
  6 (4)模式触发器:DDL
  7 (5)数据库级触发器 :数据库登陆、注销等操作
  8 
  9 --行级触发器语法
 10 create  or replace trigger  触发器名字
 11 before|after  (动作update|insert|delete 12 on 表名
 13 for each row --行级触发器
 14 begin
 15     --备份操作(插入删除的数据到备份表)
 16 end;
 17 
 18 --快速复制表结构并创建
 19 --where条件为true或不写where条件复制表数据和表结构,
 20 --where条件为false只复制表结构不复制表数据
 21 
 22 -- 创建一个删除存放记录的表
 23 create  table del_emp as select * from emp where 1=2 24 
 25 --1.建立一个行级触发器,当删除某一条记录时,将删除数据插入到某张备份表
 26 create or replace trigger tr_del_emp
 27    before delete  --触发的时机是删除前触发
 28    on emp    --指定操作的表
 29    for each row              --行级触发器
 30    when (old.deptno<>10)  --触发的条件
 31 begin
 32    --删除前将数据插入到备份表
 33    insert into del_emp(deptno,empno,ename,job,mgr,sal,comm,hiredate)
 34       values( :old.deptno, :old.empno, :old.ename, :old.job, :old.mgr, :old.sal, :old.comm,
 35        :old.hiredate);
 36 end;
 37  /
 38 
 39 --删除5001数据
 40 delete emp where empno=7902;
 41 
 42 --查询备份表
 43 select * from del_emp;
 44 
 45 --回滚
 46 rollback 47 
 48 --删除触发器
 49 drop trigger tr_del_emp; 
 50 
 51 
 52 
 53 --2.创建行级触发器,删除批量数据
 54 create or replace trigger upda_emp_row
 55   after insert or update or delete
 56   on emp
 57   for each row
 58 begin
 59   if updating then
 60     dbms_output.put_line('数据已经更新!');
 61   elsif deleting then
 62     dbms_output.put_line('数据已经删除!');
 63   elsif inserting then
 64     dbms_output.put_line('数据已经插入');
 65   end if;
 66 end;
 67 /
 68 
 69 --删除表中所有记录
 70 delete from emp;
 71 
 72 --回滚删除的数据
 73 rollback;
 74 
 75 --删除触发器
 76 drop trigger upda_emp_row;
 77 
 78 --3.创建语句触发器,删除批量数据
 79 --.语句触发器( 默认触发器)
 80 create or replace trigger upda_emp
 81   after insert or update or delete
 82   on emp
 83 begin
 84    if updating then
 85       dbms_output.put_line('数据已经更新');
 86   elsif deleting then
 87      dbms_output.put_line('数据已删除');
 88   elsif inserting then
 89     dbms_output.put_line('数据插入');
 90   end if;
 91 end;   
 92 /
 93 --删除
 94 delete from emp;
 95 
 96 --回滚
 97 rollback;
 98 
 99 --删除触发器
100 drop trigger upda_emp;
101 
102 conn system/accp
103 
104 --创建用户
105 create user user1 identified by user1;
106 
107 --授权
108 grant connect,resource to user1;
109 
110 --切换用户user1
111 conn user1
112 
113 --创建记录表
114 create table event_ddl(event varchar2(20), username varchar2(10),owner varchar2(10),
115    objname varchar2(20),objtype varchar2(10),time date);
116 
117 --4.模式触发器DDL
118 --创建用户
119  create user user1 identified by user1;
120  
121  --给用户赋权
122  grant connect ,resource to user1;
123  
124  --切换用户登录
125  conn user1/user1;
126  
127  --创建记录表
128   create table event_ddl(
129    event varchar2(20),
130    username varchar2(20),
131    owner varchar2(10),
132    objnamename varchar2(20),
133    objtype varchar2(10),
134    time date);
135   
136 --创建触发器记录user1模式的所有ddl的操作
137 create or replace trigger tr_ddl
138 after ddl on user1.schema
139 begin
140 --ora_sysevent是创建还是删除
141 --ora_login_user 登录用户
142 --ora_dict_obj_owner 操作用户
143 --ora_dict_obj_name 操作对象名称=表名
144 --ora_dict_obj_type操作类型是表还是其他
145   insert into event_ddl values(ora_sysevent,ora_login_user,ora_dict_obj_owner,ora_dict_obj_name,ora_dict_obj_type,sysdate);
146 end;
147 /
148 
149 --调用触发器
150 create table temp(a int);
151 drop table temp;
152 
153 --查看结果
154 select * from event_ddl;
155 drop table event_ddl purge;
156 
157 EVENT  USERNAME    OWNER  OBJNAMENAME   OBJTYPE   TIME
158 ----- ----------- ------- ------------  -------   -----
159 CREATE  USER1      USER1    TEMP       TABLE      13-12月-15
160 
161 DROP    USER1      USER1    TEMP       TABLE      13-12月-15
162 
163 CREATE  USER1      USER1    TEMP       TABLE      23-3月 -16
164 
165 DROP    USER1      USER1    TEMP       TABLE      23-3月 -16
166 
167 --删除触发器
168 drop trigger tr_ddl;
169    
170    
171 --5.数据库级触发器
172 --题目:记录所有用户登录和退出数据库的用户名称、登录和退出时间
173 --用管理员操作
174 conn system
175 输入密码:
176 
177 --创建记录表
178 create table log_table(
179   username varchar2(20), login_time date,
180   logoff_time date,address varchar2(20)
181   );
182   
183 --创建数据库级触发器
184 create or replace trigger tr_login
185 after logon on database
186 begin
187   insert into log_table(username,login_time,address)
188     values(ora_login_user,sysdate,ora_client_ip_address);
189 end;
190 /
191 
192 --切换用户登录
193 conn holly/sys
194 conn scott/tiger
195 conn system/sys
196 --查询记录表
197 select * from log_table;
198 USERNAME             LOGIN_TIME     LOGOFF_TIME    ADDRESS
199 -------------------- -------------- -------------- --------------------
200 HOLLY                13-12月-15
201 SCOTT                13-12月-15
202 SYSTEM               13-12月-15
203 SYSMAN               13-12月-15
204 
205 --删除表数据并且不进入回收站
206 drop table log_table purge;
207 
208 --删除触发器
209 drop trigger tr_login;
210    

 

posted @ 2016-07-24 22:40  红酒人生  阅读(596)  评论(0编辑  收藏  举报