Oracle資料庫中的觸發器練習

2021-10-02 00:14:56 字數 4744 閱讀 8662

一、表結構如圖,其中orders的orderid是主鍵,orderitem的orderid是外來鍵

-- orders表

create

table orders(

2 orderid number primary

key,

-- 編號

3 ordername varchar2(32)

,-- 名稱

4 orederprice number -- 單價5)

6/insert

into orders values(1

,'麵包',3

);insert

into orders values(2

,'衛衣',45

);insert

into orders values(3

,'手機'

,1800);

insert

into orders values(4

,'滑鼠',45

);insert

into orders values(5

,'鍵盤'

,130);

-- orderitem表

create

table orderitem(

2 orderitemid number primary

key,

-- 編號

3 orderid number references orders(orderid)

,-- 訂單編號

4 orderitemnumber number -- 訂購數量5)

6/insert

into orderitem values(1

,1,3

);insert

into orderitem values(2

,1,2

);insert

into orderitem values(3

,2,1

);insert

into orderitem values(4

,2,1

);insert

into orderitem values(5

,3,1

);insert

into orderitem values(6

,3,2

);insert

into orderitem values(7

,4,2

);insert

into orderitem values(8

,5,1

);insert

into orderitem values(9

,5,2

);

向訂單資訊表orderitem中插入資料時,如果數量小於等於0,直接將要插入的訂單數量修改1,並提示使用者訂購數量必須大於0

-- 觸發器

create

orreplace

trigger t1

before

insert

on orderitem

for each row

when

(new.orderitemnumber <1)

begin

:new.orderitemnumber:=1;

end;

-- 觸發觸發器

insert

into orderitem values(10

,5,0

);

-- 查詢一下

select

*from orderitem;

當刪除訂單表orders中的訂單時,如果該訂單的編號被orderitem表引用,就先刪除外來鍵再刪除主鍵,並提示使用者『已經將外來鍵刪除!

-- 觸發器

create

orreplace

trigger t2

before

delete

on orders

for each row

declare

n number;

begin

select

count(*

)into n from orderitem where orderid = :old.orderid;

if n >

0then

delete

from orderitem where orderid = :old.orderid;

endif

;end

;

-- 觸發觸發器

delete

from orders where orderid =

1;

二、表結構:

賬戶資訊表(cardinfo):卡號(主鍵),密碼,餘額

create

table cardinfo(

2 cardinfo_id number primary

key,

3 cardinfo_pwd varchar2(32)

,4 cardinfo_balance number

5)6/

insert

into cardinfo values(1

,'123',32

);insert

into cardinfo values(2

,'123',45

);insert

into cardinfo values(3

,'123',23

);

交易資訊表(transinfo):編號,卡號(外來鍵),交易型別(只能是』支取』和』存入』),交易金額,交易日期

create

table transinfo(

2 transinfo_id number primary

key,

3 transinfo_cardinfoid references cardinfo(cardinfo_id)

,4 transinfo_deal varchar2(32)

check

(transinfo_deal in

('支取'

,'存入'))

,5 transinfo_dealmoney number,

6 transinfo_dealdate date7)

8/insert

into transinfo values(1

,1,'支取',12

,sysdate)

;insert

into transinfo values(2

,1,'支取'

,100

,sysdate)

;insert

into transinfo values(3

,1,'存入'

,1000

,sysdate)

;insert

into transinfo values(4

,2,'存入'

,500

,sysdate)

;insert

into transinfo values(5

,2,'支取'

,100

,sysdate)

;insert

into transinfo values(6

,3,'支取'

,100

,sysdate)

;

-- 觸發器

create

orreplace

trigger t3

before

delete

on transinfo

for each row

when

(months_between(sysdate,old.transinfo_dealdate)

<1)

begin

-20002

,'這條交易記錄的時間不超過乙個月!');

end;

delete

from transinfo where transinfo_id =

3;

4.當乙個使用者開戶時(即向賬戶資訊表插入一條記錄時),應該對應的在交易資訊表中插入一條交易記錄,交易型別為』存入』,金額為1,時間為系統當前時間

-- 觸發器

create

orreplace

trigger t4

after

insert

on cardinfo

for each row

declare

n number;

begin

select

max(transinfo_id)

into n from transinfo;

insert

into transinfo values

(n+1

,:new.cardinfo_id,

'存入',1

,sysdate)

;end

;

insert

into cardinfo values(4

,'123',54

);

Oracle資料庫中的觸發器

觸發器是一種特殊的儲存過程,它在發生某種資料庫事件時由oracle系統自動觸發。觸發器通常用於加強資料庫的完整性約束和業務規則等,對於表來說,觸發器可以實現比check約束更為複雜的約束。oracle中的觸發器的型別主要有dml觸發器 替代觸發器 系統事件觸發器和ddl觸發器。針對所有的dml事件,...

oracle資料庫觸發器

instead of觸發器介紹 instead of觸發器代替觸發動作,並在處理約束之前激發 對於每個觸發操作,每個表或檢視都只能有乙個instead of觸發器。而乙個表對於每個觸發操作可以有多個after觸發器 instead of觸發器的建立模板 create or replace trigg...

Oracle資料庫update觸發器

在專案中使用到oracle資料庫的update觸發器,先記錄下來方便以後查閱。預備知識和格式以後再編輯吧,先把內容貼出來。create or replace trigger demo trigger after update on tb goods referencing new as new ol...