实验要求:
实验目的
1、 理解触发器的概念、作用及分类;
2、 掌握触发器的创建、使用;
实验内容
1、 建立表orders:用于存储订单列表信息;表order_items:用于存储单个订单的详细信息。其结构分别为:
表1 orders表结构
字段名 |
字段类型 |
字段宽度 |
说明 |
id |
NUMBER |
20 |
订单编号(主键) |
order_date |
Date |
|
订单日期(非空) |
user_name |
VARCHAR2 |
10 |
客户名称(非空) |
city |
VARCHAR2 |
20 |
客户所在城市(默认沈阳) |
表2 order_items表结构
字段名 |
字段类型 |
字段宽度 |
说明 |
order_id |
NUMBER |
20 |
订单编号(主键) |
product_NAME |
VARCHAR2 |
20 |
产品名称(非空) |
quantity |
NUMBER |
4 |
数量(大于0,小于100) |
unit_price |
NUMBER |
(10,2) |
产品单价 |
2、 创建触发器,将用户对orders表的修改,保存到日志表(自己创建)中。
3、 测试触发器。
4、 创建触发器,限制只有scott用户可以修改表orders。
5、 测试触发器。
6、 删除触发器。
7、 创建用户签订订单详细信息视图view_user_order,包括用户名、订单号、商品名、数量、单价。
8、 创建触发器,实现更新视图,更新及表数据。
9、 测试触发器。
10、删除触发器。
实验答案:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126 |
--创建orders表 create table orders( id NUMBER(20) PRIMARY
KEY NOT NULL , order_date date
not null , user_name varchar2(10) not
null , city varchar2(20) default
‘沈阳‘ ); --创建order_items表 create table order_items( order_id number(20) primary
key , product_NAME varchar2(20) not
null , quantity number(4) check (quantity BETWEEN
0 AND 100), unit_price number(10,2) ); --2、 创建触发器,将用户对orders表的修改,保存到日志表(自己创建)中。 --日志表 CREATE
TABLE T_LOG ( RID VARCHAR2(32), NAME
VARCHAR2(1000), RQ DATE
DEFAULT sysdate, OLDVALUE VARCHAR2(255), NEWVALUE VARCHAR2(255) ); --目标表 create
table orders( id NUMBER(20) PRIMARY
KEY NOT NULL , order_date date
not null , user_name varchar2(10) not
null , city varchar2(20) default
‘沈阳‘ ); CREATE
OR REPLACE
TRIGGER order_loggin AFTER UPDATE ON orders REFERENCING NEW AS
New OLD AS
Old FOR EACH ROW DECLARE BEGIN if :new.city<>:old.city then insert
into T_LOG (rid, name ,newvalue,oldvalue) values (:new.id, ‘城市‘ , :new.city , :old.city); end
if; if :new.user_name<>:old.user_name then insert
into t_log (rid, name ,newvalue,oldvalue) values (:new.id, ‘姓名‘ ,:new.user_name,:old.user_name); end
if; if :new.order_date<>:old.order_date then insert
into t_log (rid, name ,newvalue,oldvalue) values (:new.id, ‘订单日期‘ ,:new.order_date,:old.order_date); end
if; END order_loggin; --3、 测试触发器。 update
orders set
user_name= ‘213456‘
where id= ‘1‘ ; SELECT
* from t_log; --4、 创建触发器,限制只有scott用户可以修改表orders。 create
or
replace TRIGGER
alter_order BEFORE INSERT
or UPDATE
or
DELETE ON orders declare user_name VARCHAR2(30); BEGIN select
user into
user_name FROM
dual; if( lower (user_name)<> ‘scott‘ ) THEN RAISE_APPLICATION_ERROR(-20001, ‘改用户不能修改orders表‘ ); END
IF; END
alter_order; --5、 测试触发器。 update
orders set
user_name= ‘111‘
where id= ‘1‘ ; --6、 删除触发器。 DROP TRIGGER alter_order; create
table orders( id NUMBER(20) identified(1,1) PRIMARY
KEY NOT NULL , order_date date
not null , user_name varchar2(10) not
null , city varchar2(20) default
‘沈阳‘ ); create
table order_items( order_id number(20) primary
key , product_NAME varchar2(20) not
null , quantity number(4) check (quantity BETWEEN
0 AND 100), unit_price number(10,2) ); --7、 创建用户签订订单详细信息视图view_user_order,包括用户名、订单号、商品名、数量、单价。 create
or replace
VIEW view_user_order as select user_name,order_id,product_NAME,quantity,unit_price from
order_items join
orders on (order_items.order_id=orders.id); --测试 SELECT
* FROM view_user_order; --8、 创建触发器,实现更新视图,及更新表数据。 create
or
replace TRIGGER
view_user_order_trigger INSTEAD
OF INSERT
ON view_user_order FOR EACH ROW BEGIN INSERT
INTO orders(id,user_name) values (:new.order_id,:new.user_name); INSERT
INTO order_items(order_id, product_NAME, quantity,unit_price) VALUES (:new.order_id, :new.product_NAME, :new.quantity, :new.unit_price); END view_user_order_trigger; --9、 测试触发器。 insert
into view_user_order values ( ‘12310‘ ,4, ‘电话‘ ,20,1500); insert
into view_user_order values ( ‘12311‘ ,5, ‘电话‘ ,20,1500); --10、 删除触发器。 DROP
TRIGGER view_user_order_trigger; |
oracle 11g实验五——触发器的使用,布布扣,bubuko.com
原文地址:http://www.cnblogs.com/zmrid/p/3757940.html