15 07 22 資料庫 儲存過程 觸發器

2022-07-17 11:51:13 字數 3475 閱讀 3438

一、儲存

在mydb資料庫執行

select * from  fruit

select * from login

select * from orderdetails

select * from orders

select * from info

select * from family

go --儲存過程,實現使用者購買水果的操作,要判斷購買數量和庫存之間的關係,購買總價和餘額之間的關係,如果購買成功修改4個表

create procedure buyfruit --建立乙個儲存

--定義引數,引數之間用逗號隔開

@uid varchar(50),--使用者名稱

@fcode varchar(50),--要買水果編號

@sl int --要買的水果總量

as begin

declare @kc int,@price float--定義變數名及資料型別、庫存和單價

select @kc=numbers,@price=price from fruit where ids = @fcode --查出庫存和單價(變數賦值的第二種方法,查出數值進行賦值)

--判斷購買的數量是否大於庫存

if @sl>@kc

begin

print'庫存不足!'

endelse--可以買

begin

declare @yue float --定義餘額變數

select @yue = account from login where username=@uid--對餘額進行賦值

--判斷餘額是否大於購買的數量*單價

if @yue >= @price * @sl

begin--購買之後更改表資訊

update fruit set numbers = numbers-@sl where ids =@fcode--更改庫存的數量-購買的數量

update login set account = account - @price*@sl where username= @uid -- 更改存款金額:現有金額-購買數量*單價

declare @sj int--定義乙個變數隨機

set @sj = cast(rand()*10000 as int)--隨機生成乙個訂單號,隨機生成0-1之內的數

insert into orders values (@sj,@uid,getdate())--getdate獲取時間

insert into orderdetails values(@sj,@fcode,@sl)

end

else--餘額不足

begin

print'餘額不足!'

endend

endgo

declare @s int

exec @s = buyfruit 'zhangsan','k001',1 --呼叫儲存過程,

print @s

--刪除儲存過程

drop proc buyfriut

二、觸發器

--觸發器,特殊的儲存過程,執行的時間和儲存過程不一樣,儲存過程在呼叫的時候執行,觸發器是在執行某種操作的時候觸發執行,相當於c#裡面的事件

觸發器為特殊型別的儲存過程,可在執行語言事件時自動生效。sql server 包括三種常規型別的觸發器:dml 觸發器、ddl 觸發器和登入觸發器。

當伺服器或資料庫中發生資料定義語言 (ddl) 事件時將呼叫 ddl 觸發器。登入觸發器將為響應 logon 事件而激發儲存過程。與 sql server 例項建立使用者會話時將引發此事件。      

當資料庫中發生資料操作語言 (dml) 事件時將呼叫 dml 觸發器。dml 事件包括在指定表或檢視中修改資料的 insert 語句、update 語句或 delete 語句。dml 觸發器可以查詢其他表,還可以包含複雜的 transact-sql 語句。將觸發器和觸發它的語句作為可在觸發器內回滾的單個事務對待。如果檢測到錯誤(例如,磁碟空間不足),則整個事務即自動回滾。

主要講述dml觸發器,dml觸發器有兩種:after(for),instead of觸發器,同時dml 觸發器使用 deleted 和 inserted 邏輯(概念)表。 它們在結構上類似於定義了觸發器的表,即對其嘗試執行了使用者操作的表。 在 deleted 和 inserted 表儲存了可能會被使用者更改的行的舊值或新值。

一、刪除之後執行for(after) delete

--建立 loginone、biandong資料庫

select * from loginone

select * from biandong

go--建立觸發器

create trigger tr_loginone_delete--create trigger建立觸發器

on loginone --on後面是對那個表執行

for delete --刪除的時候執行

--after delete --刪除之後執行

--instead of delete --替代執行

asbegin

declare @uid varchar(50),@name varchar(50)

select @uid=username,@name=name from deleted--從delect刪除表中找2個資料,資料已經刪除

insert into biandong values(@uid,@name,'刪除')

endgo

--在對錶loginnoe進行刪除的時候觸發器執行

delete from loginone where username='aaa'

二、替代執行instead of

--instead of觸發器

--刪除student裡面的資料的時候用另外兩條語句替代,先刪從表再刪主表

create trigger tr_student_delete

on student

instead of delete

asbegin

declare @sno varchar(20)

select @sno=sno from deleted

delete from score where sno=@sno

delete from student where sno=@sno

end--執行刪除的時候觸發

delete from student where sno='101'

select * from student

select * from score

select * from course

select * from teacher

資料庫儲存過程與觸發器

資料庫儲存過程 儲存過程 stored procedure 是在大型 資料庫系統中,一組為了完成特定功能的sql 語句集,儲存在資料庫中,經過第一次編譯後再次呼叫不需要再次編譯,使用者通過指定儲存過程的名字並給出引數 如果該儲存過程帶有引數 來執行它。優點 重複使用。儲存過程可以重複使用,從而可以減...

資料庫儲存過程和觸發器

建立儲存過程 create procedure titles sum title varchar 40 sum money output asselect sum sum price from titles where title like title godeclare totalcost mon...

資料庫觸發器和儲存過程

觸發器 trigger 是由事件來觸發某個操作。這些事件包括insert語句 update語句和delete語句。當資料庫系統執行這些事件時,會啟用促發其執行相應的操作。create trigger 觸發器名 before after 觸發事件 on 表名 for each row 執行語句 每插入...