使用觸發器TRIGGER
INSERT TRIGGER
觸發器是由SQL語句集組成的代碼塊,在響應某些動作時激活該語句集.一個觸發器也可被解釋爲特定類型的存儲過程,每當動作發生時執行該存儲過程:每當基礎表中數據受到數據操縱語言(DML)語句-INSERT,UPDATE,DELETE的影響時,觸發器就被激發.
觸發器的特徵:
1. 當任何數據修改語句發出時,它被sql server自動調用
2. 在存儲過程的情況下,它不能被顯式地調用或執行
3. 它防止了對數據的不正確,未授權的,和不一致的改變
4. 它不能返回數據給用戶
觸發器語法:
CREATE TRIGGER trigger_name
ON table_name
[WITH ENCRYPTION]
FOR[INSERT | UPDATE | DELETE]
AS sql_statement
幻表:
當觸發器激發對INSERT,DELETE,或UPDATE語句的響應時,兩個特殊的表被創建:插入表(Inserted)和刪除表(deleted),
示例:
create trigger trgInsertRequisiton
on Requistion
for insert
as
declare @VacnacyReported int
declare @ActualVacancy int
select @ActualVacancy = iBudgetedStrength - currentStrength
from Position join Inserted on
Position.cPositionCode = Inserted.cPositionCode
select @VancyReported = inserted.siNoOfVacancy
from inserted
if(@@VancyReported > @ActualVacancy)
begin
print'The actual vacancies are less than the vacncies'
rollback transaction
end
return
DELETE TRIGGER
1.當試圖從觸發器表中刪除一行時,DELETE TRIGGER被觸發
2.使用DELETE TRIGGER觸發器來實現引用完整性約束主要有三種途徑:
1.串聯方法:每當從主表中刪除記錄時,刪除依賴表中的記錄
2.限制方法:如果相尖記錄出現在依賴表中,則限制從主表中刪除記錄
3.無效方法:每當一個記錄從主表中刪除時,把依賴表中所指列的值變爲無效
select * from publisher;
create trigger trgfordel
on publisher
for delete
as
begin
print '您刪除的數據的內容爲'
select * from deleted
end
delete from publisher where pub_id = 9;
UPDATE TRIGGER
當一個UPADATE觸發器被激發時,它使用關於其操作的兩個邏輯表-包含原始行的deleted表和存儲新行的insertd表.
例一:
create trigger trgUpdatePub
on Publisher
for update
as
if update(pub_id)
begin
print 'publisher id cannot be modified'
rollback tran
end
è當用戶試圖修改pub_id列時它就激發,它因此阻止用戶修改pub_id的內容並回滾整個事務
例二:
create trigger trgUpdateContractRecruiter
on ContractRecruiter
for update
as
declare @AvgPercentageCharge int
select @AvgPercentageCharge = avg(siPercentageCharge)
from ContractRecruiter
if(@AvgPercentageCharge > 11)
begin
print 'The average cannot be more than 11'
rollback transaction
end
修改觸發器語法:
alter trigger trigger_name
on table_name
[with encryption]
for[insert | delete | update]
as sql_statements
撤消觸發器:
DROP TRIGGER trigger_name[,...n]
通過觸發器加強數據的完整性
觸發器可以用來確保和加強業務規則和數據完整性,如,只有庫存中有該產品時,纔可以出售,如果使用觸發器,它將會對不正確的事務做檢查,並確保只有有效的數據才能插入到表中.
例如:某種改變違反了引用完整性,那麼所有這樣的改變都被拒絕,因此所有試圖改變數據庫中的數據都被取消.
CREATE TRIGER trgUpdateDelete
ON TitleAuthor
FOR INSERT,UPDATE
AS
If (SELECT COUNT(*) FROM Titles t JOIN inserted i
ON t.Title_id = i.Title_Id) = 0
BEGIN
PRINT 'Invialid title ID entered'
ROLLBACK
END
IF(SELECT (COUNT(*) FROM Authors t JOIN inserted i
ON t.Au_Id = i.Au_Id) = 0
BEGIN
PRINT 'INVIALID author ID eneter'
ROLLBACK
END
多觸發器:
SQL SERVER允許在給定表中定義多個觸發器.這意味着單個DML語句可激活兩個或多個觸發器.觸發器以創建次序被激活.
AFTER 和 INSTEAD OF 觸發器
AFTER觸發器在功能上,是在DML操作執行成功後.再執行的觸發器.
如:
create triger trgDeletetitles
on Titles
AFTER DELETE
AS
PRINT 'DELETION SUCCESSFUL'
*********************************************************************
假如單個DML後有多個AFTER觸發器,你可以通過使用sp_settriggerorder系統存儲過程來改變這些觸發器的執行次序.
sp_settriggerorder<triggername>,<order-value>,<DML-operation>
ordervalue = FIRST | LAST | NONEè隨機順序
DML-operation 指出創建觸發器的DML操作.
sp_settriggerorder 'trgDeleteTitles' , 'FIRST', 'DELETE'
*********************************************************************
INSTEAD OF 觸發器 替換的觸發器
如:
create trigger trgPublisherDelete
on publishers
instead of delete
as
print 'Master records cannot be deleted!'
這種觸發器在一張表上只能創建一個
使用觸發器TRIGGER總結
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.