• 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、删除触发器。

    实验答案:

    --创建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;
    

      

  • 相关阅读:
    [引用]SharePoint:在计算字段中使用Today, Me之类的函数的方法,有点搞笑,但是有效
    在infopath forms service 中自动保存而不用输入文件名
    MOSS的Sharepoint 列表中关于查阅项的处理
    Infopath Form Service示例:如何在InfoPath表单中引用SQL SERVER 中的数据?
    面对DNS劫持,只能坐以待毙吗?
    聚焦云原生,阿里云与 CNCF 共话「云未来,新可能」
    干货分享:细说双 11 直播背后的压测保障技术
    ALB Ingress 发布!轻松应对云原生应用流量管理
    如何用20分钟就能获得同款企业级全链路灰度能力?
    Serverless 架构模式及演进
  • 原文地址:https://www.cnblogs.com/ZM-Rid/p/3757940.html
Copyright © 2020-2023  润新知