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
时间: 2024-10-28 20:49:03