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
转载于:https://www.cnblogs.com/holly8/p/5701849.html
转载请注明原文地址: https://win8.8miu.com/read-1485638.html