儲存過程
概念:資料庫中乙個內建的程式段,當執行儲存過程到時候,就會將其內部的**執行一遍。
優點:1執行速度'比較'快 2安全性比較高(傳參方式決定)
語法:procdurce過程 簡稱proc
解釋:1.執行效率快:sql語句在執行的時候,"每次"執行,資料庫都會進行編譯。
儲存過程是在建立的時候編譯,一旦建立成功,就不會再進行編譯。由於少了一次編譯,所以速度提公升了。
2.儲存過程可以防止sql注入式攻擊
sql注入攻擊:
如何防範:1過濾特殊的字元 ' " \ /
2md5
3使用儲存過程
--1.無參儲存過程
create proc pr_stuquery
asselect stuid from students
go--2.有引數的儲存過程
create proc pr_stuquerybyid
@stuid int
asselect * from students where stuid=@stuid
goexec pr_stuquerybyid 5
--3有返回值的儲存過程
--3.1return型別:在需要返回的數字前加return
--限制:1只能返回數字
--2只能返回乙個
alter proc pr_insertstudent_return
@stuname nvarchar(50),
@hobby nvarchar(500),
@createtime datetime
asinsert into students values(@stuname,@hobby,@createtime)
--希望返回乙個主鍵
--全域性變數@@identity獲取新插入資料庫的主鍵
return @@identity
go--宣告變數
declare @newid int
exec @newid=pr_insertstudent_return 'admin','程式設計','2021-05-24'
select @newid
--3.2output型別
--output不限制返回值的個數和返回值的資料型別
create proc pr_insertstudent_output
@stuname nvarchar(50),
@hobby nvarchar(500),
@createtime datetime,
@newid int output,--註明引數為output型別
@helloworld nvarchar(50) output
asinsert into students values(@stuname,@hobby,@createtime)
--希望返回乙個主鍵
--全域性變數@@identity獲取新插入資料庫的主鍵
set @newid=@@identity
set @helloworld='helloworld'
godeclare @newid int
declare @helloworld nvarchar(50)
exec pr_insertstudent_output 'admin','程式設計','2021-05-24',@newid output,@helloworld output
select @newid as nid,@helloworld
事務:事務是作為單個邏輯工作單元執行的一系列操作。乙個邏輯工作單元必須有四個屬性,稱為原子性(atomicity)、一致性(consistency)、隔離性(isolation)和永續性(durability)屬性,只有這樣才能成為乙個事務。
原子性事務必須是原子工作單元;對於其資料修改,要麼全都執行,要麼全都不執行。
一致性事務在完成時,必須使所有的資料都保持一致狀態。在相關資料庫中,所有規則都必須應用於事務的修改,以保持所有資料的完整性。事務結束時,所有的內部資料結構(如 b 樹索引或雙向鍊錶)都必須是正確的。
隔離性由併發事務所做的修改必須與任何其他併發事務所做的修改隔離。事務識別資料時資料所處的狀態,要麼是另一併發事務修改它之前的狀態,要麼是第二個事務修改它之後的狀態,事務不會識別中間狀態的資料。這稱為可序列性,因為它能夠重新裝載起始資料,並且重播一系列事務,以使資料結束時的狀態與原始事務執行的狀態相同。
永續性事務完成之後,它對於系統的影響是永久性的。該修改即使出現系統故障也將一直保持。
隔離級別用於決定如何控制併發使用者讀寫資料的操作。
讀操作預設使用共享鎖;寫操作需要使用排它鎖。
讀操作能夠控制他的處理的方式,寫操作不能控制它的處理方式。
例:……關鍵語句講解………
begin transaction
/*--定義變數,用於累計事務執行過程中的錯誤--
*/declare @errorsum int
set @errorsum=0 --初始化為0,即無錯誤
/*--轉賬:張三的賬戶少1000元,李四的賬戶多1000元
*/updatebankset currentmoney=currentmoney-1000
where customername='張三'
set @errorsum=@errorsum+@@error
update bank set currentmoney=currentmoney+1000
where customername='李四'
set @errorsum=@errorsum+@@error --累計是否有錯誤
if @errorsum
<>0 --如果有錯誤
begin
'交易失敗,回滾事務
'rollback transaction --回滾
end?else
begin
'交易成功,提交事務,寫入硬碟,永久的儲存
'commit transaction
endgo
'檢視轉賬事務後的餘額
'select * from bank?go
觸發器:
概念:觸發器是乙個特殊的儲存過程。 特殊在觸發器是自動執行的,不需要進行呼叫。
需求:希望刪除使用者的時候,將使用者的日誌也進行刪除。
思考:如果我有很多個使用者都要刪除
inserted新增臨時表:存放新資料
deleted 刪除臨時表:存放舊資料
delete from students where stuid in (33,34,35,36)--刪除的觸發器
create trigger tr_deleteuser_deletelog
on students
fordelete
as --從刪除臨時表中得到剛才清除的資料
declare @stuid
intselect @stuid=stuid from
deleted
delete
from logs where stuid=@stuid
go--新增臨時表
--向a表插入一條記錄,此時我希望把資料在b表中也插入一條
alter trigger tr_inserta_insertb
on a
forinsert
asdeclare @aid
intdeclare @aname nvarchar(50)
select @aid=aid ,@aname=aname from
inserted
insert into b values(@aid,@aname,0)
go insert into a values(
'測試員aa')
select * from
aselect * from
bupdate students
set isdelete=1000
where stuid=6
--更新
alter trigger tr_deletestu_deletelog
on students
forupdate
asif
(update(isdelete))
begin
declare @isdelete
int,@oldisdelete int
declare @stuid
intselect @isdelete=isdelete from
inserted
select @stuid=stuid,@oldisdelete=isdelete from
deleted
update logs
set isdelete=@isdelete where stuid=@stuid
--希望你列印原來的邏輯狀態
print @oldisdelete
endgoupdate students
set stuname='
admin
'where stuid=6
--總結:
--1觸發器她的使用場景並不是很大,因為她比較麻煩,效率低。
--2觸發器在邏輯關係複雜的情況下,可能會導致資料處理不完整。
SQL儲存過程 觸發器
儲存過程 由使用者使用create procedure語句在當前資料庫中建立 資料庫所有者擁有使用create procedure語句的預設許可權 語法 create proc edure procedure name 建立儲存過程示例 無引數 create procedure titles 138...
sql 觸發器 儲存過程 觸發器(3 3)
1 what?什麼是觸發器 trigger 前兩篇介紹了儲存過程,儲存過程可以理解為sql語句集。那麼觸發器就是一種特殊的儲存過程,也就是一群特殊的sql語句集。特殊在哪?從上文得知,儲存過程是依賴名字才被呼叫的。不僅是儲存過程,我們常用的方法等,大部分也是先知道名字,才能去使用。就像吃飯採用訂外賣...
觸發器 儲存過程
1 為productsales資料庫中的產品表建立乙個名為update pno的update觸發器,該觸發器的作用是禁止更新產品表中的 productname 欄位的內容。並用update語句修改產品表中第一條記錄為 1 hp1500 印表機 2000 要求顯示 不能修改產品名稱 的警告資訊。cre...