再看資料庫——(3)觸發器,看資料庫觸發器
概念:
觸發器,顧名思義,它是由事件來觸發的。比如當我們對錶進行操作時就會啟用它執行。
說到觸發器,還要提一個關鍵點,那就是“保持資料完整性”。什麼意思呢?比如業務需求是,當我們登出一個卡號時,把該卡的充值、上機等資訊也一併刪除。這時如果是一個一個操作執行,就會是:登出卡——刪除卡的充值資訊——刪除卡的上機資訊(兩個刪除操作不分先後)。這樣做的弊端是,我們很容易把其中的一個步驟遺漏了,業務也不完整。用了觸發器以後,當我們登出卡時啟用觸發器執行刪除操作。
用觸發器的好處就是很大程度上有利於加強資料的完整性條件約束,符合商務規則。
類型:
DML觸發器
常用
在DML觸發器下,當我們執行增刪改查操作時,觸發器會自動執行。DML觸發器的主要作用在於強制執行業 務規則,以及擴充Sql Server約束,預設值等。
觸發器可以彌補約束只約束同一表中資料的缺陷。
DDL觸發器
主要作用:審核與規範。
我們主要用它來記錄資料庫的修改過程,以及限制程式員對資料庫的修改,比如不允許刪除某些指定表等。
登入觸發器
顯然,響應登入事件。
登入觸發器將在登入的身分識別驗證階段完成之後且使用者會話實際建立之前激發。因此,來自觸發器內部且通常將到達使用者的所有訊息(例如錯誤訊息和來自 PRINT 語句的訊息)會傳送到 SQL Server 錯誤記錄檔。如果身分識別驗證失敗,將不激發登入觸發器。
格式:
CREATE TRIGGER<觸發器名稱>
[BEFORE | AFTER] <觸發事件>ON<表名>
FOR EACH [ROW | STATEMENT]
[WHEN<觸發條件>]
<觸發動作>
注意:
觸發器與預存程序的唯一區別是觸發器不能執行EXECUTE語句調用,而是在使用者執行Transact-SQL語句時自動觸發執行。
觸發器本身沒有過錯,但由於我們的濫用會造成資料庫及應用程式的維護困難。如果我們對觸發器過分的依賴,勢必影響資料庫的結構,同時增加了維護的複雜程度。
合理的觸發器編寫對設計者和編寫者的要求很高,必須比較全面的分析相關業務,同時全面瞭解觸發器工作原理。也就是說寫出的觸發器要求在業務上考慮全面,在技術上作到最好,才能不影響業務和效能。
觸發器來實現功能比較隱蔽,不容易被注意,給後期維護帶來困難。
觸發器與約束:
觸發器的主要好處在於它們可以包含使用 Transact-SQL 代碼的複雜處理邏輯。因此,觸發器可以支援約束的所有功能;但它在所給出的功能上並不總是最好的方法。實體完整性總應在最低層級上通過索引進行強制,這些索引或是 PRIMARY KEY 和 UNIQUE 約束的一部分,或是在約束之外獨立建立的。
CHECK 條件約束只能根據邏輯運算式或同一表中的另一列來驗證列值。如果應用程式要求根據另一個表中的列驗證列值,則必須使用觸發器。約束只能通過標準的系統錯誤資訊傳遞錯誤資訊。如果應用程式要求使用(或能從中獲益)自訂資訊和較為複雜的錯誤處理,則必須使用觸發器。
如果觸發器表上存在約束,則在 INSTEAD OF 觸發器執行後但在 AFTER 觸發器執行前檢查這些約束。如果約束破壞,則復原 INSTEAD OF 觸發器操作並且不執行 AFTER 觸發器。
SQL資料庫中觸發器在哪可以查看到
在資料瀏覽器中,表的下面有。
怎查看SQL資料庫中所有的觸發?
1)查看錶中的觸發器類型:
sp_helptrigger:返回對當前資料庫的指定表定義的 DML 觸發程序的類型。sp_helptrigger 不能用於 DDL 觸發程序。
樣本: EXEC sp_helptrigger '表名'
2)查看觸發器的有關資訊:
sp_help:報告有關資料庫物件(sys.sysobjects 相容視圖中列出的所有對象)、使用者定義資料類型或某種資料類型的資訊。
樣本: EXEC sp_help '觸發器名'
3)顯示觸發器的定義:
sp_helptext:顯示規則、預設值、未加密的預存程序、使用者定義函數、觸發器或視圖的文本。
樣本: EXEC sp_helptext '觸發器名'
4)查看當前庫中所有的觸發器:
查詢指令碼:SELECT * FROM Sysobjects WHERE xtype = 'TR'
5)查看當前庫中所有的觸發器和與之相對應的表:
查詢指令碼:SELECT tb2.name AS tableName,tb1.name AS triggerName FROM Sysobjects tb1 JOIN Sysobjects tb2 ON tb1.parent_obj=tb2.id WHERE tb1.type='TR'