一、儲存
在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資料庫二、替代執行instead ofselect * 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觸發器--刪除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 執行語句 每插入...