程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> oracle 11g實驗五——觸發器的使用

oracle 11g實驗五——觸發器的使用

編輯:Oracle教程

實驗要求:

實驗五 觸發器的使用

實驗目的

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;

  

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved