qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          詳解SQL中的觸發器

           ● 原因

            ● 觸發器
              ○ 簡介
              ○ 分類
              ○ INSERTED和DELETED
              ○ 優缺點

            ● 語法
              ○ 建立觸發器
              ○ 刪除觸發器
              ○ 修改觸發器
              ○ 開啟和禁用
              ○ 提醒和保護

            ● 示例

            原因

            今天看教程再次提及觸發器,以前看數據庫視頻、牛腩視頻、天轟穿都講到過觸發器,而只知道觸發器的幾個簡單應用,感覺學的甚差,所以借此機會仔細學學觸發器。

            觸發器

            觸發器簡介:

            觸發器(trigger)是個特殊的存儲過程,它的執行不是由程序調用,也不是手工啟動,而是由事件來觸發,當對一個表進行操作( insert,delete, update)時就會激活它執行,觸發器經常用于加強數據的完整性約束和業務規則等。在我看來觸發器實際上就是一個事件,就像C#中,點擊一個按鈕會觸發相應的操作。

            觸發器的分類:

            (1)DML( 數據操縱語言 Data Manipulation Language)觸發器:是指觸發器在數據庫中發生DML事件時將啟用。DML事件即指在表或視圖中修改數據的insert、update、delete語句。

            (2)DDL(數據定義語言 Data Definition Language)觸發器:是指當服務器或數據庫中發生(DDL事件時將啟用。DDL事件即指在表或索引中的create、alter、drop語句也。

            (3)登陸觸發器:是指當用戶登錄SQL SERVER實例建立會話時觸發。

            其中DML觸發器最為常用,根據DML觸發器觸發的方式不同又分為以下兩種情況:

            (1)AFTER觸發器:它是在執行INSERT、UPDATE、DELETE語句操作之后執行觸發器操作。它主要是用于記錄變更后的處理或檢查,一旦發生錯誤,可以用Rollback Transaction語句來回滾本次扣件,不過不能對視圖定義AFTER觸發器。

            (2)INSTEAD OF觸發器:它在執行INSERT、UPDATE、DELETE語句操作之前執行觸發器本身所定義的操作。而INSTEAD OF觸發器是可以定義在視圖上的。

            INSERTED和DELETED

            在SQL SERVER 2008中,DML觸發器的實現使用兩個邏輯表DELETED和INSERTED。這兩個表是建立在數據庫服務器的內存中,我們只有只讀的權限。DELETED和INSERED表的結構和觸發器所在的數據表的結構是一樣的。當觸發器執行完成后,它們也就會被自動刪除:INSERED表用于存放你在操件insert、update、delete語句后,更新的記錄。比如你插入一條數據,那么就會把這條記錄插入到INSERTED表:DELETED表用于存放你在操作 insert、update、delete語句前,你創建觸發器表中數據庫。比如你原來的表中有三條數據,那么他也有三條數據。也就是說,我們可以使用這兩個臨時的駐留內存的表,測試某些數據修改的效果及設置觸發器操作的條件。

            觸發器的優缺點:

            觸發器可通過數據庫中的相關表實現級聯更改,可以強制比用CHECK約束定義的約束更為復雜的約束。與 CHECK 約束不同,觸發器可以引用其它表中的列,例如觸發器可以使用另一個表中的 SELECT 比較插入或更新的數據,以及執行其它操作。觸發器也可以根據數據修改前后的表狀態,再行采取對策。一個表中的多個同類觸發器(INSERT、UPDATE 或 DELETE)允許采取多個不同的對策以響應同一個修改語句。

            與此同時,雖然觸發器功能強大,輕松可靠地實現許多復雜的功能,為什么又要慎用?過多觸發器會造成數據庫及應用程序的維護困難,同時對觸發器過分的依賴,勢必影響數據庫的結構,同時增加了維護的復雜程序。

           語法

            建立觸發器

          CREATE TRIGGER 觸發器名稱
          ON 表名
          { FOR | AFTER | INSTEAD OF } 
          { [ INSERT ] [ , ] [ DELETE ] [ , ] 
             [UPDATE ] }
          AS 
            SQL 語句 [ ... n ]

            刪除觸發器:

          DROP TRIGGER 觸發器名 [ , ... n ]

            修改觸發器:

          ALTER TRIGGER 觸發器名稱
          ON 表名
          { FOR | AFTER | INSTEAD OF } 
          { [ INSERT ] [ , ] [ DELETE ] [ , ] 
             [UPDATE ] }
          AS 
            SQL 語句 [ ... n ]

            開啟和禁用:

          disable trigger trigDB on database --禁用觸發器
          enable trigger trigDB on database --開啟觸發器

            提醒和保護:

          print '刪除了觸發器***' 
          raiserror('數據一致性驗證',16,1)
          rollback transaction

            示例

            在S表創建UPDATE觸發器:

          Create trigger tri_Updates
          on s
          for update 
          as 
          print 'the table s was updated'

            禁止刪除SC表中成績不及格學生的記錄:

          CREATE TRIGGER tri_del_grade
            ON SC FOR DELETE
            AS
              IF EXISTS(SELECT * FROM DELETED    
                    WHERE Grade < 60)
                ROLLBACK

            禁止將SC表中不及格學生的成績改為及格:

          create trigger tri_update_grade
          on sc for update
          as 
            if update(grade)
            if exists(select * from inserted,deleted
            where inserted.sno=deleted.sno and inserted.grade>=60 and deleted.grade<60)
            begin 
           print '不能將不及格的成績改為及格'
            rollback
            end

          posted on 2012-06-14 11:15 順其自然EVO 閱讀(193) 評論(0)  編輯  收藏 所屬分類: 測試學習專欄數據庫

          <2012年6月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          1234567

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 长海县| 正镶白旗| 余庆县| 涪陵区| 山东省| 武平县| 六盘水市| 白银市| 商洛市| 且末县| 五河县| 应城市| 威宁| 龙南县| 临武县| 岫岩| 邳州市| 诸城市| 宁阳县| 湖州市| 界首市| 菏泽市| 平舆县| 烟台市| 宣恩县| 罗山县| 于都县| 池州市| 厦门市| 子长县| 高州市| 五原县| 新营市| 通江县| 微山县| 福贡县| 扎赉特旗| 修武县| 田林县| 深泽县| 杭州市|