觸發器和存儲過程
1. 存儲過程和觸發器是什么?
存儲過程不能可以顯著提高系統的執行速度,還能提高效率確保一致性.
1.1存儲過程:一種數據庫對象,將負責不同功能的語句分類放置起來,以便能反復使用.
1.2特點:
1.3存儲過程的分類
分為五類,系統存儲過程,用戶定義存儲過程,臨時存儲過程,遠程存儲過程,擴展存儲過程.
臨時存儲過程又分為本地臨時存儲過程,全局臨時存儲過程.
分類 |
說明 |
系統存儲過程 |
存儲在master中,以sp開頭,調用時不必加庫名,如果參數是保留字或者數據庫對象,用單引號包圍. |
用戶定義存儲過程 |
用戶為完成一定的功能定義在數據庫中存儲過程. |
臨時存儲過程 |
本地臨時:#開頭,放在tempdb中,連接斷開之后自動刪除,本庫使用. |
全局臨時:##開頭,放在tempdb中,連接斷開后使用完之后自動刪除,本連接的所有庫可以使用.注意命名. |
|
遠程存儲過程 |
位於遠程服務器上的存儲過程.通過分布式查詢和execute執行. |
擴展存儲過程 |
外部程序寫的存儲過程,xp開頭,動態鏈接庫形式存在,也放在master |
1.4存儲過程優點
1.5存儲過程和視圖的比較
1.6創建存儲過程
格式:
例子:
create procedure ShowAllStudent
as
begin
select * from students
end
1.7執行存儲過程
格式:exec procedure_name
例子:exec ShowAllStudent
1.8帶輸入參數存儲過程
格式:
例子:
create procedure SelectStudentByStu_no
@sno char(12)='200501020319'
as
begin
select * from students where stu_no=@sno
end
1.9執行帶輸入參數的存儲過程
格式:
例子:
exec SelectStudentByStu_no
@sno='200501030218'
當參數比較少的時候,可以按照位置傳遞參數.
例子:
exec SelectStudentByStu_no '200501030218'
1.10帶輸出參數的存儲過程
格式:
例子:
create procedure GetStudentCountByStu_sex
@sex char(2)='男',
@count int=0 output
as
begin
set
@count=(select count(*) from students where stu_gender=@sex)
print @count
end
執行帶輸出參數的存儲過程
例子:
declare @sex char(2) ,@count int
set @sex='男'
exec GetStudentCountByStu_sex @sex,@count
1.11 刪除存儲過程
Drop procedure GetPostsByBlogId
1.12 更新存儲過程
alter procedure GetPostsByBlogId
(@blogid varchar(50))
As
Select top 5* from Posts where BlogId=@blogid
1.13 重命名存儲過程
對象瀏覽器中修改.
1.14 重新編譯存儲過程
有三種方法:
1)創建的時候使用with Recompile 語句.
2)在執行過程中設定重新編譯
3)調用系統存儲過程重新編譯
2. 觸發器
基本表被在修改的時候通過事件觸發而執行的存儲過程.
作用是保證了由主鍵和外鍵所不能保證的參照完整性和數據完整性.
2.1觸發器的優點
觸發器可以包含復雜的處理邏輯,主要用來保持低級的數據完整性.優點如下.
2.2創建觸發器
刪除觸發器:
例子:
create trigger dropStudent
on students
for delete
as
print '成功刪除一條數據.'
更新觸發器:
create trigger updateStudentName
on students
for update
as
if update (stu_name)
begin
print '不能更新主鍵,學生號碼.'
rollback transaction
end
update students set
stu_name='五哥'
where stu_no='200501020319'
刪除觸發器:略
查看觸發器:
1)
使用系統的存儲過程查看: exec sp_helptrigger students
使用系統表: select name from sysobjects where type='TR'
2) 管理器查看 略
刪除觸發器: drop trigger updateStudent
修改觸發器:
重命名: sp_rename dropStudent,deleteStudentItem
啟動和停止觸發器:
alter table students enable trigger all