oracle 11g实验五——触发器的使用
            时间:2014-05-30 01:46:16  
            收藏:0  
            阅读:1629
        
        
        实验要求:
实验五 触发器的使用
实验目的
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表createtableorders(  id NUMBER(20) PRIMARYKEYNOTNULL,  order_date datenotnull,  user_name varchar2(10) notnull,  city varchar2(20) default‘沈阳‘);--创建order_items表createtableorder_items(  order_id number(20) primarykey,  product_NAME varchar2(20) notnull,  quantity number(4) check(quantity BETWEEN0 AND100),  unit_price number(10,2));--2、    创建触发器,将用户对orders表的修改,保存到日志表(自己创建)中。--日志表CREATETABLET_LOG (   RID      VARCHAR2(32),   NAMEVARCHAR2(1000),   RQ        DATEDEFAULTsysdate,   OLDVALUE  VARCHAR2(255),   NEWVALUE  VARCHAR2(255) ); --目标表createtableorders(  id NUMBER(20) PRIMARYKEYNOTNULL,  order_date datenotnull,  user_name varchar2(10) notnull,  city varchar2(20) default‘沈阳‘);CREATEORREPLACETRIGGERorder_loggin AFTERUPDATEONorders REFERENCING NEW ASNew OLD ASOld FOREACH ROW DECLAREBEGIN  if :new.city<>:old.city  then     insertintoT_LOG (rid,name,newvalue,oldvalue)             values(:new.id,‘城市‘, :new.city , :old.city);   endif;   if :new.user_name<>:old.user_name    then     insertintot_log (rid,name,newvalue,oldvalue)             values(:new.id,‘姓名‘,:new.user_name,:old.user_name);   endif;   if :new.order_date<>:old.order_date     then     insertintot_log (rid,name,newvalue,oldvalue)             values(:new.id,‘订单日期‘,:new.order_date,:old.order_date);   endif; ENDorder_loggin;  --3、    测试触发器。updateorders setuser_name=‘213456‘whereid=‘1‘;SELECT* fromt_log;--4、    创建触发器,限制只有scott用户可以修改表orders。createorreplaceTRIGGERalter_orderBEFORE INSERTorUPDATEorDELETEONorders declare  user_name VARCHAR2(30);BEGINselectuserintouser_name FROMdual;if(lower(user_name)<>‘scott‘) THEN    RAISE_APPLICATION_ERROR(-20001,‘改用户不能修改orders表‘);  ENDIF;  ENDalter_order;--5、    测试触发器。updateorders setuser_name=‘111‘whereid=‘1‘;--6、    删除触发器。DROPTRIGGERalter_order;createtableorders(  id NUMBER(20) identified(1,1) PRIMARYKEYNOTNULL,  order_date datenotnull,  user_name varchar2(10) notnull,  city varchar2(20) default‘沈阳‘);createtableorder_items(  order_id number(20) primarykey,  product_NAME varchar2(20) notnull,  quantity number(4) check(quantity BETWEEN0 AND100),  unit_price number(10,2));--7、    创建用户签订订单详细信息视图view_user_order,包括用户名、订单号、商品名、数量、单价。   createorreplaceVIEWview_user_orderasselectuser_name,order_id,product_NAME,quantity,unit_price fromorder_items joinorders on(order_items.order_id=orders.id);--测试SELECT* FROMview_user_order;--8、    创建触发器,实现更新视图,及更新表数据。createorreplaceTRIGGERview_user_order_trigger      INSTEADOF      INSERTONview_user_order FOREACH ROW   BEGIN      INSERTINTOorders(id,user_name) values(:new.order_id,:new.user_name);      INSERTINTOorder_items(order_id, product_NAME, quantity,unit_price)             VALUES(:new.order_id, :new.product_NAME, :new.quantity, :new.unit_price);ENDview_user_order_trigger;--9、    测试触发器。insertintoview_user_order values(‘12310‘,4,‘电话‘,20,1500);insertintoview_user_order values(‘12311‘,5,‘电话‘,20,1500);--10、   删除触发器。DROPTRIGGERview_user_order_trigger; | 
            评论(0)
        
        
        