首页 > 代码库 > oracle 11g实验五——触发器的使用
oracle 11g实验五——触发器的使用
实验要求:
实验五 触发器的使用
实验目的
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; |
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。