實驗四觸發器實驗
?。ㄒ唬?/p>
after
觸發器
?。? 1 )
在l l i neitem 表上定義一個 after 觸發器, , 當修改列項目e e x tendedprice d i scount
x tax 時, , 要把 s orders 表得to o tal pri ce e 一起修改, , 以保證數據一致性
C RE ATE T RIGGER
trig _line ite m_ pr ice_ update on line it em fo r upda te
a as
begin i f (UPDATE(ex tend edprice)
o r UPDATE(tax)
or UPD AT E(di scou nt)) begin
-— 聲明游標變量指向 inserted 表
d eclare
cursor_inserted c urs or
rea d_only
o for select order key,linenu mber,exte nd edpr ice, dis coun t, tax
from
in ser ted
—-息信找查取獲量變明聲? 聲明變量獲取查找信息
de clare order key in t, @linenumb er
?。閚t,exte nd edprice
?。騟al,dis scount real,tax real
—- 打開游標 epo? en cursor_i ns ert ed
—-標游取讀? 讀取游標
fe tch
next
from cur sor _i ns erte d int o @o rderkey, @lin enumber,e ext ende dprice, @di scount,t ax
?。?whi le FETC H_S TATUS =0 nigeb? n
? —- 聲明一個變量保存重新計算得新價格 ced?? ecl are @n ew_tota lpri ce
r eal
? select @n ew_t otal price= @ext en dedpr ice *(1 -@di scou nt) *(1 +@tax)
—- 用新得總價格變量更新 orders 表得 t ot alprice pu?? update orde rs
se t tot alpri ce= new_totalprice where or derkey=orde rkey
?。錸 hctef? ext f ro m cur sor_i nser ted int o @order ke y, @li nenum ber, @ex tende dp rice,discoun t, @tax
dne?llaed? locate c ur sor_i nser te d e end end ?(2)在 在 linei tem表上定義一個 aftr er 觸發器, , 當增加一項訂單明細時, ,
自動修改 s orders 表得 total p rice, 以保證數據一致性
CREATE TR IGGER tri g_ lineit em_price_ in sert on l ine item f for inse rt
a s begin ——向指量變標游明聲? 聲明游標變量指向ins erted 表
de clare
c ursor_inse rted
cursor
read_ onl y
? for s ele ct orderkey,linenumbe r,ex te ndedp ric e,di scou nt,t ax
from ins serte d
-- 聲明變量獲取查找信息 ed? eclare @orde rk ey
int, @lin enumber int,e xten dedp rice
real, @discount
real, @ta x real -—? - 打開游標
open cursor_i ns erte d --? - 讀取游標
fe tc h
nex t
f rom
cu rsor_ins erted
into
?。纎 rd erkey,li nen umbe er r, ex ten ded pric e,dis count,tax ihw? ile @@FE TCH_ STATU S=0 eb? egin
-—格價新得算計新重存保量變個一明聲?? 聲明一個變量保存重新計算得新價格
?。鉫d? clare @n ew_tot alprice real
celes? ct new _to ta lprice= @extend edp rice *( 1-d is count) *(1+tax) —-新更量變格價總得新用?? 用新得總價格變量更新orders 表得totalpri ce
? u pda te
or ders s et
t ota lpric e=total pric e+ @new_ tota lpr ice w wh he re o rderke y=orderkey
?。簦錰? etch next from cursor_ ins erte d into o rder key, @l inen umber,e xtended dp ric e, @disc ou nt, @t ax
?。?end aed? deall oca te cu rsor_in serted en d
(3)
在l in e ite m表上定義一個a ft er觸發器, , 當刪除一項訂單明細記錄時, ,
自動修改 orders 表得 tot a lprice, 以保證數據一致性
CREATE TRI GG ER trig _line item_price_de let e
on line item fo r de let e
?。?AS begin
- -聲明游標變量指向delet ed 表
de clar e curso r_d eleted cursor
?。騟 ad _on ly
?。錽
rof?? ele ct ord erk ey,line numbe r,extende dp rice,discoun t, tax
from
del eted -? -- 聲明變量獲取查找信息
declare ord erkey int,linenum be r
int,extendedp ri ce r eal,discou nt real,ta x real -—? -
打開游標 epo? en c urso r_ deleted
——標游取讀? 讀取游標 ef? etch next fr om cur sor_delete d in to
order ke y,l inenumb er,ext end dedprice, @di scoun t,tax
wh ile @FETCH_STATUS=0
begi n
-— 聲明一個變量保存重新計算得新價格
? declare @ne w_ to talpric e real
? s selec t @new_t otalpr ice= @exte nde dpri ce*(1- @disco unt) *(1+ tax)
?。? -— 用新得總價格變量更新orders 表得tot alp rice u?? upd ate
orders set t otalpri ce=to talpr ice- @new _totalp rice wh er e order key= @ord erkey
fetch
n ext f rom cursor_inse rt ed in to orderkey, @line numbe r,extende ed dprice, @d iscou nt,t ax dne? nd
?。?deal lo cat e cur sor_inse rted e end ( (4 4) ) 驗證 up d at e觸發器
— -查瞧 號訂單得 to ta a l pr i ce
selec t
*
?。妫騩 o m
o o r ders where
orde r key=1 8 30;
— -查瞧明細表得相關信息
se l ect *
?。?ro m
lin ei i te e m
?。?here or de e r key=183 0
and l ine num m be e r =1;
—— 驗證 e update 觸發器
updat e
lineitem set t ax=tax+0 、 05
?。鳎瑁?re orderkey=1830;
(二)
i i n stead
?。铮?/p>
觸發器
?。?(1)
)
在 在 lineit em 表上定義一個ins tead o f upda te觸 發器, 當修改明細表中得數量 量quan ti ty 時, 應先檢查供應表par tsupp 得av ai lqty 就是否足夠, 不足夠則拒絕執行, 否則執行并修改相應數值以保證數據一致性 于 由于 in stead
of 觸發器更新某個表會使得該表上其她不滿足更新列不能更新,因 因用 此逆向思維使用 a fter 觸發器實現相同效果 即先更新 qu antity, 再比較av ailq qt ty, 如果滿足更新數量, 就修改partsupp 得 表得 a vailqty, 如果不滿足, 則把lineitem得quantity 更新之后得數據重新修改回來 c create trigge r trig_lin eit em_quanti ty_ upda te
on
li neit em f or upda te
as begin if UPDATE(qu ant ity) b begin ——向指別分量變標游明聲? 聲明游標變量分別指向 i nserted 表與 d el eted 表 ed? declare c urso r_inser ted
cur sor
r ead_on ly
for
?。鬰eles?? t
orde rkey, partk ey,s uppkey,lin enum ber, quantit y fr om i nserted
?。洌錭l are
cursor_de leted c urs or
rea d_ onl y
f or select quantity
fr om deleted
-—息信找查取獲量變明聲? 聲明變量獲取查找信息
decl are
?。溃駏 an tity _dif f_lineitem i nt,q uanti ty_pa rtsup p i nt ced? clare suppkey int, @par tke y in t,o rd erkey i nt,
unenil?? um ber int ,qty _inserted in t , @qty_delete d int
- - 打開游標 ruc nepo? rsor_in sert ed po? open cur sor_d eleted
-—量變給賦值數標游取讀? 讀取游標數值賦給變量 f? fet ch next from
cu rsor_ insert ed
? i into or de rk ey,pa rtkey, @suppk ey, @line nu mber, @qty _ins erte d
f et ch
?。睿鍃t from
cursor _d eleted
int o q ty _de lete d
whi le fe tch_st atus=0 geb? egin
- -計算訂單明細修改時, 訂購數量得變化值 inserte d表項-d elet ed表項
s sel ect quantity_d if f_ li neit em= @q ty _in se rte d—@ @q ty_delete ed
? --從parts upp 表獲?。醰a ilq ty值, 注意partsupp 表得主鍵為(partk ey,suppke ey) tceles?? t @quanti ty_p ar tsupp =av ailq ty fro m pa rtsu pp
?。?? wh er e suppkey= suppke y
and part key= @par tk ey
-—斷判始開?? 開始判斷
?。纾澹? begi n
fi? f quant ity _d iff_ lin eite m=0
?
? p rin t " 更新得數量與原表中得值相同, 不需要更新"
e ls e if @quantit y_d iff_lin eitem 〈=q uantity_partsupp
?
be gin
? pu?? pd ate partsupp
s et avail qty= availqty- @qua ntit y_d iff_li ne item
? pus erehw? ppkey=suppkey
?。醤d
p artkey= @par tke y
?
? p rint " 兩個表都更新成功’ ?
??ne? nd
els e
?。間eb?? in
? u?? update li nei tem
set
?。駏antit y=quantity+ @quanti ty_diff_linei tem
whe re o rd erke y=@orde rke y and li nenu mber= @li ine number
?
p ri nt '更新失敗"
?? end
? e nd ef?? etch ne xt
fr om c urso r_i nserted
i nto @ord erke y, @partkey,s upp key, @linenumb er, @qt y_ ins ert ed
f etch ne xt from curso r_de leted into @qt y_d elet ed dne? nd
d eallocat e cur sor _i nserte d
dealloc at e cursor_de le ted e end e end (2)在 在 l ineite m表上定義一個 instea d of in sert 觸發器, 當插入明細表中一條記錄 時 時, 應先檢查供應表par tsupp 得 得 ava il qt y就是否足夠 qu anti ty 得數量 c rea te t rig ger tri g_lineitem_q ua nti ty_ insert
on
line item i instead of inser t as b begin
-— 聲明游標變量指向 inserte d表
d eclar e cur sor_inserte d cur sor
rea d_ only f or
?。?? select or derk ey,pa rtkey,sup pk ey, lin en umber,q uantity
f rom ins er ted
-—
聲明變量獲取查找信息
dec lare quantity int, @av ailq ty i nt, @suppkey
?。閚 t, @partkey
in nt t, @o rderkey int, @linenu mber int
-—標游開打? 打開游標 c nepo? curs or_ins erted -? -— 讀取游標
f etc h next fro m cursor_insert ed int o @orde rkey,partkey,@ @s suppkey, @linenumber,qu antity
wh ile @@FETCH_S TATUS= 0 igeb? in
-- 為變量賦值
?。?tceles? availqty y
?。?=av ai lqt y fr om
?。餫rtsupp
w? whe re suppkey =@su ppk ey and part ke y= partke y
? if @quant ity 〈= @avail qt y
-— 如果可以更新
b? begin /??? /*將 將 insert ed 表中得記錄插入到明細表*/
? sni? sert
i nto l ineite m select *
from i nserted
ro=yekredro
erehw?? rderk ey and
linenumb er = @linenumber */??新更時同? *同時更新 part supp 表得數量*/
?? u upd ate pa rtsup p set a vailqty=availqty- @quanti ty
?
?。錼ehw? e sup pke y= @sup pkey and partkey=part key
p pr int ’pa arts upp 表有足夠得貨物可以滿足 lin eitem 得quan tity y, 插入成功’
end
else
begin
?? p rint t
?。?'pa rt sup p表沒有足夠得貨物可以滿足 l ineitem 得 得 q uantity,插入失敗’
dne?f?? fetc h next from curso r_ins ert ed in to @ord erkey, partkey, suppkey, @li inenumbe r, qu antity e? en d
deall ocat e cursor_ inserted end ( 3)在 在 line ite m表上定義一個 inste ad of del ete 觸發器,當 當 刪除 明細表中記錄 時 時, 同時改變表 供應表 partsupp 得ava il qty y 數值 c re ate trigge r tri g_ lin eit em_quanti ty_ del ete o n line item inste ad of del ete as be gin
—- 聲明游標變量指向deleted 表
de cla re curs or_ del eted c ursor
?。騟ad _only for
les?? elect or derke y, par tkey,sup pkey, linenumbe r,quan tity fr om deleted -? -- 聲明變量
decl are s upp key i nt, par tke y
int, @orde rkey int,linen umb er
int, @qua ant it y int
—-標游開打? 打開游標
open
cursor_deleted
-—標游取讀? 讀取游標
?。?fetch next fr om
curs or _del et ed
?。閚 to @ord erkey , @partkey,s uppke ey, @lin en umber,q ua ntity
whi le
?。?FET CH_ STATUS=0 igeb? in
*/*除刪? *刪除*/
? de let e from
lineite m where linenu mber= line number and o rde rkey =ord der key
*/新更時同? 同時更新 pa rt supp 表得數量*/
u pdate
parts upp se t
availqt y=a vai lq ty+quant ity
? where s uppke y= @s uppkey a nd par tk ey= @p ar tkey
? p rin t
’ 刪除成功, 并且已經把貨物數量歸還到 p ar tsup p里" f?? fetc h ne xt fr om
curso r_del eted
into @ord er ke y
,p ar tkey,@ @suppkey, @lin enu mber,quanti ty ne? nd ed? ea lloc ate cursor_ delete d end (4) 驗證 update 觸發器 -- 查瞧li neit em 得quan tit y select *
fr om
lin eit em whe re or derk ey =1830
and li nenum ber=1;
—— 查詢partsupp 表得ava ilqt y se lect * from part supp w here suppk ey =(select
supp key fr om
lin e
item w here ord erkey=18 30)
and partk ey
=(s elec t part key from lin eite m wh er e
order key =18 30 a nd linenu mber=1)
-- - 更新數量過大
—— 更新得值與原值相同
-- - 更新到+ + 2 00 數量, , 成功
update
?。靑 neitem set
?。駏ant ity
=q uanti ty+ 200
where order key=1830
and lin en umber = 1;
-- 更新 +2 00 成功后l ineite m得 quanti ty y 變化
—— 更新+200 成功后par ts upp 表得a va ilqty 變化
實驗到此。所有創建得觸發器結果
刪除觸發器
dr op trigger tri g_li nei tem_de lete; 實驗六存儲過程實驗
?。? 1 )
定義無參數 得存儲過程并執行
更新所有訂單總價
go?
CREATE
?。蠷OCED URE Pro c_Ca lTotalP ri ce
AS BEGIN
up date
o rders set to talprice =
(sele ct sum( exte ndedprice*(1-discount)*(1+ tax))
? fr om li nei tem
o
erehw? orders 、orderkey= li neite m。o rderke y) END
?。鏾 執行此存儲過程
exec P ro c_CalTotal Pric c e; ;
?。? 2 )
定義有參數得存儲 過程并執行
更新給定訂單號得總價
g go create pro cedu re P ro_Cal TotalP rice 4Ord er @id_ order
intege r a as be gin
?。?up date e
?。?orders set total price=(
?。靍s? lect SU M(ext en ded price*(1 -di sc ount)*(1 +tax))
? fr om li neit em
? whe re
orde rs 。or derke y=lin eite m。orderkey) end g o 執行此存儲過程 exe c P ro_ CalTota lPr ice 4Order @id_ order=2; ( (3)
?。?/p>
定義有局部變量得存儲過程 更新某一個顧客所有訂單得總價 g o cr eate
procedure Proc_Ca lTot alPr ice4Custo me r n ame _cus to mer varc har( 50) as
dec lare cus tk ey _c usto mer i nt b egin tceles? t
cus tke y_cu stomer=cu st key
?。妫颍飉
cu sto mer
where name _customer =RTRI M(n ame)
u pdate order s set to talp ri ce=( tceles?? t S UM(exte nde dp rice *(1 -dis count)*(1+tax)) rf?? rom li neite m
?。? wher e orders 、order key=lineitem 。or derke y
? and
o rde rs 、cust key= @c ustkey _cust omer) ?e nd go 執行此存儲過程
e xec Pro c_CalT ot alPr ic e4C ustome r name_custom er=" 艾錦亮’; 查瞧結果 u pdate
linei te m set
ex tende dpric e=1 00 , ta x=0.25 where orderkey="1 830’; s elect * from
l ineite m
w here order key ='183 0’;
s elect * fr om or ders wh ere custke y= (sele ct cus tk ey from custo mer whe re name=’ 艾錦亮’);
?。? )
定義一個帶輸出參數得存儲過程 更新某個顧客得所有得訂單總價, 并輸出總價 go crea te proc edure Proc_C alT otalP ri ce4Custo me r2
na me_ cu st ome r va rch ar( 50), totalpr ice_ord er real out put
as —— 聲明一個變量存儲 name 對應得顧客編號 d eclar e @c us tkey _cus tomer integer
—— 為該變量賦值
se lec t c ustke y_cu sto mer =cu stkey
from cus tome r w here n ame_ customer=R TRIM(n ame) begi n -? -- 更改訂單總價
up date
o rd ers
?。骵t t otalp rice=(
se lec t SUM(ext endedprice*(1-dis count)*( 1+tax))
?。? fr om l in eitem rehw?? ere
orders 。o rderk ey=li neit em.ord erk ey
、sredro dna? 、c ustkey =@custkey_ custome r)
-— 為返回變量賦值
select
?。鬿talprice_order=total pri ce fro m orders
? w here custk ey= @c ustkey_c ustom er
?
e nd go —- 執行帶有輸出參數得存儲過程要聲明輸出參數變量 declare t otalp rice re al ; exe c Proc_ Cal Tota lPrice4C ustomer2
" 艾錦亮 ', @to talpri ce
output; -- 在屏幕上輸出返回值結果
?。骵lec t t otalpri ce;
實驗到此, , 所有結果顯示
(5 5 )
修改存儲過程名
?。澹鴈c sp_renam e ’Pr o_Cal TotalPrice4Ord er",
’C alTotalPr ice4 Or der';
(6) 編譯存儲過程
exe c sp_ re compile ’CalTotalPric ce 4Order’;
(7) 刪除存儲過程
?。?drop
?。餽oc edure CalT otalPric e4Orde r; e exe c sp_h elptext CalT ot alPrice4 Order;
推薦訪問: 實驗 報告 SQL上一篇:圖實驗報告
下一篇:小學校長述職報告-述職報告
同志們:今天這個大會,是市委全面落實黨要管黨、從嚴治黨要求的一項重大舉措,也是對縣市區委書記履行基層黨建工作第一責任人情況的一次集中檢閱,同時是對全市基層黨建工作的一次再部署、再落實的會議。前面,**
***年,我認真履行領班子、帶隊伍、抓黨員、保穩定的基層黨建工作思路,以學習貫徹習近平新時代中國特色社會主義思想和黨的十九大歷次全會精神為主線,以市局基層黨建工作考核細則為落腳點,落實全面從嚴治黨主體
根據會議安排,現將2022年履行抓基層黨建工作職責情況報告如下:一、履職工作特色和亮點1 突出政治建設,著力在思想認識上提高。牢固樹立抓黨建就是抓政績的理念,以“黨建工作抓引領、社區治理求突破,為民服
2022年以來,在**黨委的正確領導下,堅持以習近平新時代中國特色社會主義思想為指導,深入學習宣傳貫徹黨的二十大精神,以黨建工作為統領,扎實開展夯實“三個基本”活動,以“四化四力”行動為抓手,聚力創建
各位領導,同志們:根據會議安排,現就2022年度抓基層黨建工作情況匯報如下:一、主要做法及成效(一)強化政治引領。一是不斷強化理論武裝。堅持通過黨組會、中心組學習會和“三會一課”,第一時間、第一議題學
2022年度抓基層黨建工作述職報告按照黨委工作部署,現將本人2022年度抓基層黨建工作情況報告如下:一、2022年度抓基層黨建工作情況(一)旗幟鮮明講政治將旗幟鮮明講政治放在全局發展首要位置,積極開展
2022年,是我在數計系黨總支書記這個新崗位上度過的第一個完整的工作年度?;厥滓荒陙碓谛|h委的正確領導下,與數計系領導班子和全體師生共同走過的日子,艱辛歷歷在目,收獲溫潤心田。作為黨總支書記,我始終牢
按照考核要求,現將本人一年來,作為統戰部長履行職責、廉潔自律等方面情況報告如下:一、著眼增強政治素質,不斷深化理論學習堅持把旗幟鮮明講政治作為履職從政的第一位要求,帶領統戰系統干部堅決擁護“兩個確立”
**年,緊緊圍繞黨工委、管委會的決策部署,全體人員團結協作、凝心聚力,緊扣黨工委“**”基本工作思路,全力開拓進取,認真履職盡責,圓滿完成各項工作任務。一、個人思想政治狀況檸檬文苑www bgzjy
按照縣委關于開展抓基層黨建述職評議會議的有關要求,經請示縣委組織部同意,今天,我們在此召開2022年度基層黨組織書記抓基層黨建述職評議會議。1 首先,請**黨委書記,**同志述職。**黨委能夠主動研究