實驗要求:
實驗目的
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;