使用觸發器TRIGGER總結

使用觸發器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!'
這種觸發器在一張表上只能創建一個

發佈了49 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章