一、存儲過程
一:存儲過程:存儲過程是一組為了完成特定功能的SQL 語句集,經編譯后存儲在數據庫中。
可以用存儲過程名字和參數來調用存儲過程,這樣可以避免代碼重復出現,用起來也方便。
例: 下面是定義了一個名為Buyfruit的存儲過程,參數為購買人的姓名,水果名稱,購買數量三個,此存儲過程的作用是,輸入了這三個參數之后,判斷賬戶余額和庫存是否足夠,足夠的話將賬戶余額減掉花費,將庫存減掉購買的數量顯示出來,打印一個訂單,和一個明細。
1 create PROCEDURE BuyFruit 2 @username varchar(20), 3 @fruitname varchar(20), 4 @buycount int = 0 5 AS 6 BEGIN 7 declare @kc int,@price float,@fruitid varchar(20) 8 --先把該水果的庫存量找出來 9 select @fruitid=ids, @kc = numbers,@price=price from fruit where name=@fruitname 10 11 --根據購買數量和庫存的關系,進行購買 12 if @buycount < @kc 13 begin 14 declare @money decimal(18,2) 15 select @money = account from login where username=@username --根據用戶名找到賬戶余額 16 if(@money > @price*@buycount) 17 begin 18 update login set account=account-@price*@buycount where username=@username 19 update fruit set numbers = numbers-@buycount where name=@fruitname 20 declare @ordercode varchar(50) 21 set @ordercode ='O'+cast(getdate() as varchar(50)) 22 insert into orders values(@ordercode,@username,GETDATE()) 23 insert into orderdetails values(@ordercode,@fruitid,@buycount) 24 end 25 else 26 begin 27 print '余額不足' 28 end 29 end 30 else 31 begin 32 print '庫存不足' 33 end 34 EN
購買之前數據庫中的內容:
購買成功之后數據庫中存儲的內容:
添加到訂單的和購買明細:
二:觸發器
觸發器是一種特殊的存儲過程
觸發器主要是通過事件進行觸發而被自動執行的,而存儲過程可以通過存儲過程名字而被直接調用
觸發器的主要作用就是其能夠實現由主鍵和外鍵所不能保證的復雜的參照完整性和數據的一致性,另外還有強化約束和級聯運行的功能。
關於inserted和deleted臨時表
這兩個表是由系統管理的,存儲在內存中,不是存儲在數據庫中,因此不允許用戶直接對其修改,是只讀的,系統在執行插入操作的時候先將數據插入到inserted臨時表中,然后再向數據庫的表中插入,在插入下一條時這條被刪除;執行刪除操作的時候,先將數據傳到deleted表里,再刪除數據,起到一個保存臨時數據用來恢復或者記錄的作用。
下面這個是做了一個刪除時觸發的觸發器,在刪除student表中數據時,將刪除的這一行插入到biandong表里面
--用於刪除觸發的觸發器:
create trigger TR_STUDENT_DELETE
on student
for delete --for觸發器after觸發器,刪除后觸發
as
declare @no varchar(3),@name varchar(4)
select @no=sno,@name=sname from deleted --用到了臨時表
insert into biandong values(@no,@name,'100')
go
--下面執行刪除的時候觸發上面的程序,
delete from student where sname='猴子'
還有一種是instead of觸發,觸發的時候用觸發器里面的程序代替執行操作,即執行觸發器里面的東西
下面例子,原來三個表,由info表里的code約束另外兩個表,因此沒法單獨刪除info中的某一行,利用觸發器可以刪除三個表中code為p001的行
create trigger TR_INFO_DELETE
on info
instead of delete --instead of 觸發器,刪除的時候替代執行觸發器
as
declare @code varchar(20)
select @code=code from deleted
delete from family where infocode=@code
delete from work where infocode=@code
delete from info where code=@code
go
instead of 觸發器創建完成下面開始觸發:
delete from INFO where name ='胡軍'
此時刪除了三個表中p001的行
D、刪除觸發器:
drop trigger TR_INFO_DELETE