SQLServer之觸發器簡介

来源:https://www.cnblogs.com/vuenote/archive/2018/10/08/9753846.html
-Advertisement-
Play Games

觸發器定義 觸發器是資料庫伺服器中發生事件時自動執行的一種特殊存儲過程。SQLServer允許為任何特定語句創建多個觸發器。它的執行不是由程式調用,也不是手工啟動,而是由事件來觸發,當對資料庫進行操作時就會激活它執行。 觸發器分類 分為DML觸發器、DDL觸發器、登錄觸發器、嵌套觸發器、遞歸觸發器。 ...


觸發器定義

觸發器是資料庫伺服器中發生事件時自動執行的一種特殊存儲過程。SQLServer允許為任何特定語句創建多個觸發器。它的執行不是由程式調用,也不是手工啟動,而是由事件來觸發,當對資料庫進行操作時就會激活它執行。

觸發器分類

分為DML觸發器、DDL觸發器、登錄觸發器、嵌套觸發器、遞歸觸發器。

DML觸發器

定義

如果用戶要通過數據操作語言 (DML) 事件編輯數據,則執行 DML 觸發器。 DML 事件是針對錶或視圖的 INSERT、UPDATE 或 DELETE 語句。 在激發任何有效的事件時,將會激發這些觸發器,而無論是否會影響任何表行。 

分類

AFTER觸發器(之後觸發)

在執行 INSERT、UPDATE、MERGE 或 DELETE 語句的操作之後執行 AFTER 觸發器。 如果違反了約束,則永遠不會執行 AFTER 觸發器;因此,這些觸發器不能用於任何可能防止違反約束的處理。 對於在 MERGE 語句中指定的每個 INSERT、UPDATE 或 DELETE 操作,將為每個 DML 操作觸發相應的觸發器。

INSTEAD OF觸發器

INSTEAD OF觸發器替代下列觸發語句的標準操作。 因此,觸發器可用於對一個或多個列執行錯誤或值檢查,然後在插入、更新或刪除行之前執行其他操作。INSTEAD OF觸發器的主要優點是可以使不能更新的視圖支持更新。 INSTEAD OF觸發器的另一個優點是使您得以編寫這樣的邏輯代碼:在允許批處理的其他部分成功的同時拒絕批處理中的某些部分。

下表對 AFTER 觸發器和 INSTEAD OF 觸發器的功能進行了比較。

函數AFTER 觸發器INSTEAD OF 觸發器
適用範圍 表和視圖
每個表或視圖包含觸發器的數量 每個觸發操作(UPDATE、DELETE 和 INSERT)包含多個觸發器 每個觸發操作(UPDATE、DELETE 和 INSERT)包含一個觸發器
級聯引用 無任何限制條件 不允許在作為級聯引用完整性約束目標的表上使用 INSTEAD OF UPDATE 和 DELETE 觸發器。
執行 晚於:

約束處理

聲明性引用操作

創建插入的 和 刪除的 表

觸發操作
之前:約束處理

代替:觸發操作

之後:創建 插入的 和 刪除的 表
執行順序 可指定第一個和最後一個執行 不適用
插入的和 刪除的表中的 varchar(max) 、 nvarchar(max) 和 varbinary(max) 列引用 Allowed Allowed
插入的和 刪除的表中的 text 、 ntext 和 image 列引用。 不允許 Allowed

CLR 觸發器

CLR 觸發器可以是 AFTER 觸發器或 INSTEAD OF 觸發器。 CLR 觸發器還可以是 DDL 觸發器。 CLR 觸發器將執行在托管代碼(在 .NET Framework 中創建併在 Transact-SQL 中上傳的程式集的成員)中編寫的方法,而不用執行 SQL Server存儲過程。

應用場景

DML 觸發器可用於強制業務規則和數據完整性、查詢其他表並包括複雜的Transact-SQL 語句。 將觸發器和觸發它的語句作為可在觸發器內回滾的單個事務對待。 如果檢測到錯誤(例如,磁碟空間不足),則整個事務即自動回滾。

優點

DML 觸發器類似於約束,因為可以強制實體完整性或域完整性。 一般情況下,實體完整性總應在最低級別上通過索引進行強制,這些索引應是 PRIMARY KEY 和 UNIQUE 約束的一部分,或者是獨立於約束而創建的。 域完整性應通過 CHECK 約束進行強制,而引用完整性 (RI) 則應通過 FOREIGN KEY 約束進行強制。 當約束支持的功能無法滿足應用程式的功能要求時,DML 觸發器非常有用。

下麵的列表比較 DML 觸發器和約束,併在 DML 觸發器優於約束時進行標識。

  • DML 觸發器可以將更改通過級聯方式傳播給資料庫中的相關表;不過,使用級聯引用完整性約束可以更有效地執行這些更改。 除非 REFERENCES 子句定義了級聯引用操作,否則 FOREIGN KEY 約束只能用與另一列中的值完全匹配的值來驗證列值。

  • DML 觸發器可以防止惡意或錯誤的 INSERT、UPDATE 以及 DELETE 操作,並強制執行比 CHECK 約束定義的限制更為複雜的其他限制。

    與 CHECK 約束不同,DML 觸發器可以引用其他表中的列。 例如,觸發器可以使用另一個表中的 SELECT 比較插入或更新的數據,以及執行其他操作,如修改數據或顯示用戶定義錯誤信息。

  • DML 觸發器可以評估數據修改前後表的狀態,並根據該差異採取措施。

  • 一個表中的多個同類 DML 觸發器(INSERT、UPDATE 或 DELETE)允許採取多個不同的操作來響應同一個修改語句。

  • 約束只能通過標準化的系統錯誤消息來傳遞錯誤消息。 如果應用程式需要(或能受益於)使用自定義消息和較為複雜的錯誤處理,則必須使用觸發器。

  • DML 觸發器可以禁止或回滾違反引用完整性的更改,從而取消所嘗試的數據修改。 當更改外鍵且新值與其主鍵不匹配時,這樣的觸發器將生效。 但是,FOREIGN KEY 約束通常用於此目的。

  • 如果觸發器表上存在約束,則在 INSTEAD OF 觸發器執行後但在 AFTER 觸發器執行前檢查這些約束。 如果違反了約束,則回滾 INSTEAD OF 觸發器操作並且不執行 AFTER 觸發器。

DDL觸發器

定義

DDL 觸發器用於響應各種數據定義語言 (DDL) 事件。 這些事件主要與以關鍵字 CREATE、ALTER、DROP、GRANT、DENY、REVOKE 或 UPDATE STATISTICS 開頭的 Transact-SQL 語句對應。 執行 DDL 式操作的系統存儲過程也可以激發 DDL 觸發器。

分類

Transact-SQL DDL 觸發器

用於執行一個或多個 Transact-SQL 語句以響應伺服器範圍或資料庫範圍事件的一種特殊類型的 Transact-SQL 存儲過程。 例如,如果執行某個語句(如 ALTER SERVER CONFIGURATION)或者使用 DROP TABLE 刪除某個表,則激發 DDL 觸發器。

CLR DDL 觸發器

CLR 觸發器將執行在托管代碼(在 .NET Framework 中創建併在 Transact-SQL 中上傳的程式集的成員)中編寫的方法,而不用執行 SQL Server存儲過程。

僅在運行觸發 DDL 觸發器的 DDL 語句後,DDL 觸發器才會激發。 DDL 觸發器無法作為 INSTEAD OF 觸發器使用。 對於影響局部或全局臨時表和存儲過程的事件,不會觸發 DDL 觸發器。

DDL 觸發器不會創建特殊的 inserted 和 deleted 表。

可以使用 EVENTDATA 函數捕獲有關激發 DDL 觸發器的事件以及觸發器導致的後續更改的信息。

為每個 DDL 事件創建多個觸發器。

與 DML 觸發器不同,DDL 觸發器的作用域不是架構。 因此,不能將 OBJECT_ID、OBJECT_NAME、OBJECTPROPERTY 和 OBJECTPROPERTYEX 之類的函數用於查詢有關 DDL 觸發器的元數據。 請改用目錄視圖。

伺服器範圍的 DDL 觸發器顯示在 SQL Server Management Studio 對象資源管理器的“觸發器”文件夾中。 此文件夾位於 “伺服器對象” 文件夾下。 資料庫範圍的 DDL 觸發器顯示在“資料庫觸發器”文件夾中。 此文件夾位於相應資料庫的 “可編程性” 文件夾下。

應用場景

  • 防止對資料庫架構進行某些更改。

  • 希望資料庫中發生某種情況以響應資料庫架構的更改。

  • 記錄資料庫架構的更改或事件。

優點

更加安全

通過使用 EVENTDATA( ) 函數,可以在觸發器中使用XML信息。

登錄觸發器

定義

登錄觸發器將為響應 LOGON 事件而激發存儲過程。 與 SQL Server實例建立用戶會話時將引發此事件。 登錄觸發器將在登錄的身份驗證階段完成之後且用戶會話實際建立之前激發。 因此,來自觸發器內部且通常將到達用戶的所有消息(例如錯誤消息和來自 PRINT 語句的消息)會傳送到 SQL Server 錯誤日誌。 如果身份驗證失敗,將不激發登錄觸發器。

應用場景

可以使用登錄觸發器來審核和控制伺服器會話,例如通過跟蹤登錄活動、限制 SQL Server的登錄名或限制特定登錄名的會話數。

指定第一個和最後一個觸發器

可以對 LOGON 事件定義多個觸發器。 通過使用 sp_settriggerorder 系統存儲過程,可以將這些觸發器中的任何一個指定為針對某事件激發的第一個或最後一個觸發器。 SQL Server 不保證其餘觸發器的執行順序。

嵌套觸發器

如果一個觸發器在執行操作時調用了另外一個觸發器,而這個觸發器又接著調用了下一個觸發器,那麼就形成了嵌套觸發器。嵌套觸發器在安裝時就被啟用,但是可以使用系統存儲過程sp_configure禁用和重新啟用嵌套觸發器。

註意事項

  • 預設情況下,嵌套觸發器配置選項是開啟的。
  • 在同一個觸發器事務中,一個嵌套觸發器不能被觸發兩次。
  • 由於觸發器是一個事務,如果在一系列嵌套觸發器的任意層次中發生錯誤,則整個事物都將取消,而且所有數據回滾。

遞歸觸發器

定義

觸發器的遞歸是指一個觸發器從其內部再一次激活該觸發器。

分類

SqlServer中的遞歸觸發器包括兩種:直接遞歸和間接遞歸。

  • 直接遞歸:觸發器被觸發後並執行一個操作,而該操作又使用一個觸發器再次被觸發。
  • 間接遞歸:觸發器被觸發並執行一個操作,而該操作又使另一個表中的某個觸發器被觸發,第二個觸發器使原始表得到更新,從而再次觸發第一個觸發器。

預設情況下,遞歸觸發器選項是禁用的。遞歸觸發器最多只能遞歸16層,如果遞歸中的第16個觸發器激活了第17個觸發器,則結果與發佈的rollback命令一樣,所有數據都將回滾。

觸發器優缺點

優點:

  1、觸發器是自動的。當對錶中的數據做了任何修改之後立即被激活。

  2、觸發器可以通過資料庫中的相關表進行層疊修改。

  3、觸發器可以強制限制。這些限制比用CHECK約束所定義的更複雜。與CHECK約束不同的是,觸發器可以引用其他表中的列。

缺點:

  1、增加了系統的複雜性。

  2、嵌套觸發器容易出現死鎖現象。

  3、觸發器並沒有提升多少性能。

  4、可移植性差。

  5、占用伺服器資源,給伺服器造成壓力。

  6、複雜的觸發器維護困難。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 查看版本:select version();顯示當前時間:select now();註意:在語句結尾要使用分號;遠程連接一般在公司開發中,可能會將資料庫統一搭建在一臺伺服器上,所有開發人員共用一個資料庫,而不是在自己的電腦中配置一個資料庫運行命令mysql -hip地址 -uroot -p-h後面寫... ...
  • 是由JS引擎的限製造成的。 MapReduce的結果無法寫入到一個被Sharding的Collection中,2.0版本對這個問題的解決好像也不徹底; 對於數組型的數據操作不夠豐富. 文章資源下載地址 "https://www.slidestalk.com/s/mongodb_zixvrv" ...
  • 軟體:CentOS-7 VMware12 SSHSecureShellClient shell工具:Xshell 規劃 vm網路配置 01.基礎配置 02.ssh配置 03.zookeeper配置 04.hadoop配置 05.mysql配置_單節點 06.hbase配置 07.hive配置 08. ...
  • Oracle入門 進入Oracle 連接Oracle資料庫 \ sqlplus 不登錄鏈接資料庫: sqlplus /nolog 預設sqlplus不能上下頁翻頁,可通過安裝rlwrap解決,安裝步驟: \ ./configer \ make \ make install 登錄帳號: 自帶測試帳號: ...
  • mysql提供了一個特別的explain語句,用來分析查詢語句的性能 : explain select ... 1.在所有用於where,order by,group by的列上添加索引 創建索引 2.用union優化like語句 當or關鍵字在where子句中使用頻率過高時,它可能會使mysql優 ...
  • 玩北京賽車不僅心態要好,還需要註意投註的精確計算與風險測試,有了這些數據支持之後,再加上我自己獨特的投註技巧,現在在玩賽車的過程中已經能做到贏多輸少,贏大輸小,長期下來持續穩定盈利,創造了很多記錄。這套方法是我玩彩到現在以來見過的、用過的最穩妥的方法,也有自己很多的技術成分在裡面。想玩好北京賽車,我... ...
  • 轉自:http://www.maomao365.com/?p=7141 摘要: 下文講述sql腳本編寫中,將 特定值排在最前面的方法分享, 實驗環境:sqlserver 2008 R2 例:將數據表中指定值為0的行排在最前面呈現給用戶 ...
  • 作者:天山老妖S 鏈接:http://blog.51cto.com/9291927 一、數據完整性簡介 1、數據完整性簡介 數據冗餘是指資料庫中存在一些重覆的數據,數據完整性是指資料庫中的數據能夠正確反應實際情況。數據的完整性是指數據的可靠性和準確性,數據完整性類型有四種:A、實體完整性:實體的完整 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...