初識觸發器(1)

来源:http://www.cnblogs.com/kelly1314/archive/2017/06/30/7097132.html
-Advertisement-
Play Games

轉眼,從實習到畢業,來公司已經差不多有4個月了。在學校沒學到什麼東西,怪自己太懶,又沒有鑽研技術的那股精神。如今來公司做金蝶系列的插件開發,都顯得很吃力。 之前在學校,資料庫就學了一點毛皮,現在要學會寫SQL存儲過程,觸發器,報表等高級SQL查詢語句,下麵給出自己學習寫觸發器的過程: 什麼是觸發器, ...


轉眼,從實習到畢業,來公司已經差不多有4個月了。在學校沒學到什麼東西,怪自己太懶,又沒有鑽研技術的那股精神。如今來公司做金蝶系列的插件開發,都顯得很吃力。

之前在學校,資料庫就學了一點毛皮,現在要學會寫SQL存儲過程,觸發器,報表等高級SQL查詢語句,下麵給出自己學習寫觸發器的過程:

  什麼是觸發器,從網上搜了一大堆資料後,總結如下:

    觸發器,顧名思義,通過觸發來引發的一種執行語句。其實觸發器也是一種特殊的存儲過程,一般的存儲過程是通過存程名直接調用,而觸發器是通過事件進行觸發而執行的。這是一個什麼樣的事件呢?主要分為增,刪,改之類的執行事件 。當表中的數據發生變化時自動強制執行。常見的觸發器有兩種:

  after(for)        表示執行代碼後,執行觸發器

  instead of        表示執行代碼前,用已經寫好的觸發器代替你的操作

 

  觸發器語法:

  create trigger 觸發器的名字   on 操作表

  for|after         instead of

  update|insert|delete

  as

  SQL語句

 

觸發器實現原理圖

 

     其中after觸發器要求只有執行某一操作insert、update、delete之後觸發器才被觸發,且只能定義在表上。而instead of觸發器表示並不執行其定義的操作(insert、update、delete)而僅是執行觸發器本身。既可以在表上定義instead of觸發器,也可以在視圖上定義。

 

    觸發器有兩個特殊的表:插入表(instered表)和刪除表(deleted表)。這兩張是邏輯表也是虛表。有系統在記憶體中創建者兩張表,不會存儲在資料庫中。而且兩張表的都是只讀的,只能讀取數據而不能修改數據。這兩張表的結果總是與被改觸發器應用的表的結構相同。當觸發器完成工作後,這兩張表就會被刪除。Inserted表的數據是插入或是修改後的數據,而deleted表的數據是更新前的或是刪除的數據。

對錶的操作

Inserted邏輯表

Deleted邏輯表

增加記錄(insert)

存放增加的記錄

刪除記錄(delete)

存放被刪除的記錄

修改記錄(update)

存放更新後的記錄

存放更新前的記錄

 

    Update數據的時候就是先刪除表記錄,然後增加一條記錄。這樣在inserted和deleted表就都有update後的數據記錄了。註意的是:觸發器本身就是一個事務,所以在觸發器裡面可以對修改數據進行一些特殊的檢查。如果不滿足可以利用事務回滾,撤銷操作。   

 

觸發器示例

Example1

 

--禁止用戶插入數據(實際上是先插入,然後立刻將其刪除!)

 

  create trigger tr_insert on bank

 

  for          --for表示執行之後的操作

 

  insert       --即先執行了插入操作,同時在臨時表中保存了插入記錄

 

  as

 

   --執行完插入之後,在新生成的表中將剛剛插入的那條記錄刪除,

 

   --而此時得到的剛剛插入的記錄的id是通過臨時表 inserted得到的

 

  delete * from bank where cid=(select cid from inserted)

 

 

 

  生成上面的觸發器後,當用戶再輸入insert語句後就見不到效果了!

 

  如:insert into bank values('0004',10000),是插入不進資料庫的。

 

Example2

--刪除誰就讓誰的賬戶加上10元

  create trigger tr_dalete on bank

  instead of

  delete

  as

  update bank balance=balance+10 where cid=(select cid from deleted)

  生成這個觸發器之後,當用戶輸入delete語句後,對應的那個id不但沒有被刪除掉,而且他的賬戶增加了10元

 

  如:delete from bank where cid='0002',執行完這句話後,編號為0002的賬戶會增加10元

 

 

 

經典案例eg:

觸發器的簡單實例
eg:禁止插入新的數據的觸發器(先插入,再刪除)
CREATE TRIGGER tr_insert ON scorerecord
FOR (after)
INSERT
AS
DELETE FROM scorerecord WHERE id =(SELECT id FROM inserted)


測試SQL語句 : INSERT INTO scorerecord VALUES('1018','1306','c#編程','98')


eg2:
CREATE TRIGGER tr_insert2 ON usertest
AFTER
INSERT
AS
DELETE FROM usertest WHERE Id_P =(SELECT Id_P FROM INSERTED)

測試SQL語句:INSERT INTO usertest(Id_P,Lastname,Firstname) VALUES('3','習大大','琢磨')

 

刪除時候,自動加10分
eg1:
CREATE TRIGGER tr_delete ON scorerecord
INSTEAD OF
DELETE
as
UPDATE scorerecord SET score = score + 10 WHERE id = (SELECT id FROM deleted)

測試SQL語句:DELETE FROM dbo.scorerecord WHERE id = '26'

eg2:
CREATE TRIGGER tr_delete2 ON usertest
INSTEAD OF
DELETE
as
UPDATE usertest SET score = score+19 WHERE Id_P =(SELECT Id_P FROM deleted )

測試SQL語句:DELETE FROM usertest WHERE Id_P ='1'

 

 

另外測試:

--觸發器的案例
--創建觸發器
CREATE TRIGGER tr_mytrigger ON testdate2
AFTER UPDATE
as PRINT 'the table was update!'

--測試
UPDATE testdate2 SET Course = '歷史' WHERE Course ='英語'

--修改觸發器
ALTER TRIGGER tr_mytrigger ON testdate2
FOR UPDATE
as PRINT '一定要學會用觸發器'

--測試
UPDATE testdate2 SET Score = Score + 60 WHERE username ='小明'
SELECT * FROM dbo.testdate2

--查看觸發器內容
EXEC sp_helptext tr_mytrigger

--查詢資料庫中有多少觸發器
SELECT * FROM sysobjects WHERE xtype ='tr'

select * from sys.triggers --查詢資料庫中觸發器的名字 當不知道觸發器名字的時候
select * from sysobjects where type='tr' and name='tr_mytrigger' --知道觸發器的名字

--禁用觸發器
DISABLE TRIGGER tr_mytrigger ON testdate2

--啟用觸發器
ENABLE TRIGGER tr_mytrigger ON testdate2

--觸發器功能比較強大,但是一旦觸發,恢復起來比較麻煩,那我們就需要對數據進行保護,這裡需要用到rollback數據回滾

ALTER TRIGGER tr_mytrigger ON testdate2
AFTER UPDATE
as
IF EXISTS(SELECT * FROM testdate2 WHERE Score='156')
ROLLBACK

--測試
UPDATE testdate2 SET Score ='97' WHERE Score = '82' --有數據保護,觸發器中止


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

-Advertisement-
Play Games
更多相關文章
  • 查詢的格式: select [distinct] *(所有)| 欄位名... from 表名 [where 條件過濾]查詢指定欄位信息pname priceselect pname,price from products; 查詢表中所有欄位select * from products; 去除金額重覆 ...
  • 導讀: 分類問題是機器學習應用中的常見問題,而二分類問題是其中的典型,例如垃圾郵件的識別。本文基於UCI機器學習資料庫中的銀行營銷數據集,從對數據集進行探索,數據預處理和特征工程,到學習模型的評估與選擇,較為完整的展示瞭解決分類問題的大致流程。文中包含了一些常見問題的處理方式,例如缺失值的處理、非數 ...
  • 1 Redis記憶體管理 Redis記憶體管理相關文件為zmalloc.c/zmalloc.h,其只是對C中記憶體管理函數做了簡單的封裝,屏蔽了底層平臺的差異,並增加了記憶體使用情況統計的功能。 void *zmalloc(size_t size) { // 多申請的一部分記憶體用於存儲當前分配了多少自己的內 ...
  • 本文用到的資料庫如下: CREATE DATABASE exam; / 創建部門表 / CREATE TABLE dept( deptno INT PRIMARY KEY, dname VARCHAR(50), loc VARCHAR(50) ); / 創建雇員表 / CREATE TABLE em ...
  • PostgreSQL在Update時使用Substring函數截取字元串並且加上CASE WHEN THEN條件判斷 ...
  • (一)執行sql遇到的錯誤如下: ### Cause: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (38708097 > 4194304). You can change this value on the ...
  • 一 概述 1 背景 理論上將全部數據放到同一張表中很難實現,實際上即使實現了,表也很龐大,很冗雜,不便於查詢與維護,因此將不同的數據存放到不同的表中,需要時連接各表進行查詢。 2 執行過程 兩張表進行連接查詢時,將其中一張表中的每一行數據與另外一張表的全部數據進行對比,如果滿足給定的條件,則將這兩行 ...
  • JDBC_ODBC,純java方式連接mysql 1.單詞部分 ①JDBCjava連接資料庫②driver manager驅動③connection連接④statement聲明 ⑤execute執行⑥query查詢⑦result set結果集⑧connectivity連通⑨access存取使用 en ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...