SQL Server:觸發器詳解

来源:https://www.cnblogs.com/cxping/archive/2018/06/08/9156595.html
-Advertisement-
Play Games

SQL Server:觸發器詳解 SQL Server:觸發器詳解 1. 概述 2. 觸發器的分類 3. Inserted和Deleted表 4. 觸發器的執行過程 5. 創建觸發器 6. 修改觸發器: 7. 刪除觸發器: 8. 查看資料庫中已有觸發器: 9. “Instead of”相關示例: 1 ...


SQL Server:觸發器詳解

 

SQL Server:觸發器詳解

 

1. 概述

觸發器是一種特殊的存儲過程,它不能被顯式地調用,而是在往表中插入記錄﹑更新記錄或者刪除記錄時被自動地激活。 所以觸發器可以用來實現對錶實施複雜的完整性約束。

2. 觸發器的分類

SQL Server2000提供了兩種觸發器:“Instead of” 和“After” 觸發器。

一個表或視圖的每一個修改動作(Insert、Update和Delete)都可以有一個“Instead of” 觸發器,一個表的每個修改動作都可以有多個“After”觸發器。

2.1 “Instead of”觸發器

  • “Instead of”觸發器在執行真正“插入”之前被執行。除表之外,“Instead of” 觸發器也可以用於視圖,用來擴展視圖可以支持的更新操作。
  • “Instead of”觸發器會替代所要執行的SQL語句,言下之意就是所要執行SQL並不會“真正執行”
 

上例中定義了“trigger學生_Delete”觸發器,該觸發器從“delete”表中列印出所要刪除的學生.在執行“delete”操作後,會發現“學號 = 4”的學生並未被刪除, 原因在於“trigger學生Delete”替代了所要執行的“delete from 學生 where 學號 = 4”語句,而在“trigger學生_Delete”中並未真正刪除學生。

2.2 “After”觸發器

  • “After”觸發器在Insert、Update或Deleted語句執行之後被觸發。“After”觸發器只能用於表。
  • “After”觸發器主要用於表在修改後(insert、update或delete操作之後),來修改其他表

3. Inserted和Deleted表

SQL Server為每個觸發器都創建了兩個專用表:Inserted表和Deleted表。

  • 這兩個表由系統來維護,它們存在於記憶體中而不是在資料庫中,可以理解為一個虛擬的表。
  • 這兩個表的結構總是與被該觸發器作用的表的結構相同。
  • 觸發器執行完成後,與該觸發器相關的這兩個表也被刪除。
  • Deleted表存放由於執行Delete或Update語句而要從表中刪除的所有行。
  • Inserted表存放由於執行Insert或Update語句而要向表中插入的所有行。
對錶的操作Inserted邏輯表Deleted邏輯表
增加記錄(insert) 存放增加的記錄
刪除記錄(delete) 存放被刪除的記錄
修改記錄(update) 存放更新後的記錄 存放更新前的記錄

4. 觸發器的執行過程

  • 如果一個Insert﹑update或者delete語句違反了約束,那麼這條SQL語句就沒有執行成功,因此“After”觸發器也不會被激活。

  • “Instead of” 觸發器可以取代激發它的操作來執行。它在Inserted表和Deleted表剛剛建立,其它任何操作還沒有發生時被執行。因為“Instead of” 觸發器在約束之前執行,所以它可以對約束進行一些預處理。

5. 創建觸發器

create trigger trigger_name on  {table_name|view_name} {After|Instead of} {insert|update|delete} as 相應T-SQL語句

6. 修改觸發器:

alter trigger trigger_name on  {table_name|view_name} {After|Instead of} {insert|update|delete} as 相應T-SQL語句

7. 刪除觸發器:

drop trigger trigger_name

8. 查看資料庫中已有觸發器:

8.1 查看資料庫中所有觸發器

select from sysobjects where xtype='TR'

8.2 查看單個觸發器

exec sp_helptext '觸發器名'

9. “Instead of”相關示例:

兩張表:學生(學號 int, 姓名 varchar)、借書記錄(學號 int, 圖書編號 int)

實現功能:在刪除學生表時,如果該學生仍有借書記錄(未還)則不能刪除

alter trigger trigger_學生_Delete on 學生 instead of Delete as begin     if not exists(select from 借書記錄, deleted where 借書記錄.學號 = deleted.學號)         delete from 學生 where 學生.學號 in (select 學號 from deleted) end

10. “After”觸發器

10.1 在“訂單”表中建立觸發器,當向“訂單”表中插入一條訂單記錄時,檢查“商品”表的貨品狀態“狀態”是否為1(正在整理),則不能往“訂單”表加入該訂單。

create trigger trigger_訂單_insert on 訂單 after insert as     if (select 狀態 from 商品, inserted where 商品.pid = inserted.pid)=1     begin         print 'the goods is being processed'         print 'the order cannot be committed'         rollback transaction --回滾,避免加入     end
  • 該示例中“pid”為商品編碼
  • 該示例的if判斷嚴格來講是不准確的,因為“訂單”表如果每次插入一條記錄,該判斷沒有問題;如果一次插入多條記錄,則“select 狀態”返回的是多行。

10.2 在“訂單”表建立一個插入觸發器,在添加一條訂單時,減少“商品”表相應的貨品記錄中的庫存。

create trigger trigger_訂單_insert2 on 訂單 after insert as     update 商品 set 數量 = 數量 - inserted.數量     from 商品, inserted     where 商品.pid = inserted.pid

10.3 在“商品”表建立刪除觸發器,實現“商品”表和“訂單”表的級聯刪除。

create trigger goodsdelete trigger_商品_delete on 商品 after delete as     delete from 訂單 where 訂單.pid in (select pid from deleted)

10.4 在“訂單”表建立一個更新觸發器,監視“訂單”表的“訂單日期”列,使其不能被“update”.

create trigger trigger_訂單_update on 訂單 after update as     if update(訂單日期)     begin         raiserror('訂單日期不能手動修改',10,1)         rollback transaction     end

10.5 在“訂單”表建立一個插入觸發器,保證向“訂單”表插入的貨品必須要在“商品”表中一定存在。

create trigger trigger_訂單_insert3 on 訂單 after insert as     if (select count(*) from 商品, inserted where 商品.pid = inserted.pid)=0     begin         print '商品不存在'         rollback transaction     end

10.6 “訂單”表建立一個插入觸發器,保證向“訂單”表插入的貨品信息要在“訂單日誌”表中添加

alter trigger trigger_訂單_insert on 訂單 for insert as     insert into 訂單日誌 select inserted.Id, inserted.pid,inserted.數量 from inserted     轉載原文:http://www.cnblogs.com/rainman/p/3675834.html#m1
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • linux 查看系統當前時間,修改時間1. 查看時間和日期命令 : "date"2.設置時間和日期例如:將系統日期設定成2018年6月8日的命令命令 : "date -s 06/08/2018"將系統時間設定成下午10點46分03秒的命令命令 : "date -s 10:46:03" ...
  • 一、列表 list 列表是有序的,列表元素可以被修改 list之灰魔法 1、列表格式: 中括弧括起來, 逗號分隔每個元素, 列表中的元素可以是數字、字元串、列表、布爾值、等所有的都能放進去 “集合“,”內部可以放置任何東西 li=['alex', '小名', [12, 23, 45], 23, 23 ...
  • RDD是spark的核心,先感性的先認識RDD,大體上對RDD進行了分類操作 ...
  • today,i'll have a test with the open source tool mysqlbinlog_flashback which is released by 58daojia,here's the github address:https://github.com/58da ...
  • 1. 下載mongodb資料庫:https://www.mongodb.com/download-center#community 2. 加壓tar.gz壓縮包,把解壓文件拷貝到程式目錄即可 3. 創建data目錄和logs目錄,建議不要和程式目錄相同 4. 創建mongodb.conf配置文件,修 ...
  • 死鎖概述 對於資料庫中出現的死鎖,通俗地解釋就是:不同Session(會話)持有一部分資源,並且同時相互排他性地申請對方持有的資源,然後雙方都得不到自己想要的資源,從而造成的一種僵持的現象。當然,在任何一種資料庫中,這種僵持的情況不會一直持續下去,因為一直持續下去雙方永遠都無法執行,沒有任何意義,在 ...
  • 數據過濾 WHERE組合子句 本章講授如何組合WHERE子句以建立功能更強的更高級的搜索條件。 我們還將學習如何使用NOT和IN操作符。 1.組合WHERE子句 上一章介紹的WHERE子句在過濾數據時使用的都是單一條件過濾。事實上為了數據的準確性我們還可以使用多個條件進行過濾,可以使用AND子句或者 ...
  • 1、YCSB背景 YCSB,全稱為“Yahoo!Cloud Serving Benchmark”,是雅虎開發的用來對雲服務進行基礎測試的工具,其內部涵蓋了常見的NoSQL資料庫產品,如Cassandra、MongoDB、HBase、Redis等等。在運行YCSB的時候,可以配置不同的workload ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...