觸發器的基本概述
在sqlserver2005中,儲存過程和觸發器都是sql語句和流程控制語句的集合,就本質而言,觸發器也是一種儲存過程,它是一種在基本表被修改時自動執行的內嵌過程,主要通過事件進行觸發而被執行,而儲存過程可以通過儲存過程名字而被直接呼叫,當對某一張表進行如update,insert,delete這些操作時,sqlserver就會自動執行觸發器所定義的sql語句.從而確保對資料的處理符合由這些sql語句所定義的規則.觸發器的主要作用是其能實現由主鍵和外來鍵所不能保證的複雜的參照完整性和資料的一致性.
優點:由於在觸發器中可以包含複雜的處理邏輯,因此,應該將觸發器用來保持低階的資料的完整性,而不是返回大量的查詢結果.使用觸發器主要可以實現以下操作:
1.強制比check約束更複雜的資料的完整性
在資料庫中實現資料的完整性的約束,可以使用check約束或觸發器來實現.但是在check約束中不允許引用其他表中的列來完成檢查工作,而觸發器可以引用其他表中的列來完成資料的完整性的約束.
2.使用自定義的錯誤提示資訊
使用者有時需要在資料的完整性遭到破壞或其他情況下,使用預先自定義好的錯誤提示資訊或動態自定義的錯誤提示資訊,通過使用觸發器使用者可以捕獲破壞資料的完整性的操作,並返回自定義的錯誤提示資訊.
3.實現資料庫中多張表的級聯修改
使用者可以通過觸發器對資料庫中的相關表進行級聯修改
4.比較資料庫修改前後資料的狀態
觸發器提供了訪問有insert,update,delete語句引起的資料前後狀態變化的能力.因此使用者就可以在觸發器中引用由於修改所影響的記錄行.
5.維護規範化資料
使用者可以使用觸發器來保證非規範資料庫中的低階資料的完整性,維護非規範化資料與表的級聯是不同的,表的級聯指的是不同表之間的主外來鍵關係,維護表的級聯可以通過設定表的主鍵與外來鍵的關係來實現,而非規範資料通常是指在表中派生的,冗餘的資料值,維護非規範化資料應該通過使用觸發器來實現.
觸發器的建立
語法:create trigger 觸發器名稱
on 表名
for insert或update或delete
asbegin
要執行的操作
end示例:
create table users(
userid int identity primary key,
username nvarchar(20) not null,
userpwd nvarchar(20) not null
)create table usertype(
typeid int identity primary key,
typename nvarchar(20) not null,
userid int not null
)--insert觸發器
create trigger addusertype
on users
for insert
asbegin
declare @userid int
set @userid=@@identity
insert into usertype values('家人',@userid)
insert into usertype values('同學',@userid)
insert into usertype values('同事',@userid)
insert into usertype values('朋友',@userid)
endinsert into users values('zhanghaidang','wdpc');
可以看到usertype表插入了四條記錄
--delete觸發器
create trigger delusertype
on users
for delete
asbegin
if @@rowcount=0
return
else
begin
declare @userid int
--注意,這裡是deleted,後面多了乙個d,下面專門介紹deleted
--select @userid=userid from deleted
--delete from usertype where userid=@userid
delete from usertype where userid in (select userid from deleted)
endend
delete from users where userid=4
觸發器有2個專用表
乙個是inserted,其中的資料記錄的是更新後的資料
乙個是deleted,其中的資料記錄的是更新前的資料
當對某張表建立觸發器後,分3種情況討論
1.插入操作(insert)
inserted表有資料,deleted表無資料
2.刪除操作(delete)
inserted表無資料,deleted表有資料
3.更新操作(update)
inserted表有資料(新資料),deleted表有資料(舊資料)
簡單來說: 刪除的資料儲存在deleted表中 插入的資料儲存在inserted表中
--update觸發器
create table userrecord(
recordid int identity primary key,
recordname nvarchar(20) not null,
recordphone nvarchar(20) not null,
typeid int,
username nvarchar(20) not null
)create trigger updateusers
on users
for update
asbegin
declare @oldusername nvarchar(20),@newusername nvarchar(20)
select @oldusername=username from deleted
select @newusername=username from inserted
update userrecord set username=@newusername where username=@oldusername
endupdate users set username='wujinghui' where userid=4
第八章 指標 第八章 指標
1 什麼是位址 include using namespace std int main 11 在堆中建立對像 我們既然可以在堆中儲存變數,那麼也就可以儲存對像,我們可以將對像儲存堆中,然後通過指標來訪問它 include using namespace std class human 14 在建構...
第八章(筆記)
能在 中進行記憶體單元的定址的暫存器只有4個,分別是bx si di bp 其中bx bp 是基址,bx對應的段位址是ds,bp對應的段位址是ss si di 是變址,單獨使用時段位址是ds,組合使用段位址是跟隨組合的基址對應的段位址 中進行記憶體單元定址彙總 si di bx bp 常量 si 常...
第八章 字典
d 空字典 d 這就是字典 d dict.fromkeys a b d dict zip keyslist,valslist d dict name bob age 22 建立字典的函式 d name 通過索引key獲取對應的value d.keys 返回d字典物件所有key,返回乙個列表 d.va...