第七章 觸發器與事件


7.1 觸發器的概念及管理

  1. 概念

    觸發器是一種特殊的存儲過程,它在插入,刪除或修改特定表中的數據時觸發執行,它比數據庫本身標准的功能有更精細和更復雜的數據控制能力。 

    存儲過程的優點:

      安全性:可以基於數據庫的值使用戶具有操作數據庫的某種權利。

      審計:可以跟蹤用戶對數據庫的操作。

      實現復雜的數據完整性規則

      實現復雜的非標准的數據庫相關完整性規則。

  2. 創建使用觸發器

    觸發程序是與表有關的命名數據庫對象,當表上出現特定事件時,將激活該對象。

    語法格式:

      create trigger trigger_name trigger_time trigger_event on tbl_name for each row trigger_stmt

    說明

      trigger_event與以表操作方式激活觸發程序的sql語句並不很類似, 這點很重要。

    【例1】創建一個表tb,其中只有一列a,在表上創建一個觸發器,每次插入操作時,將用戶變量count的值加一

    【例2】創建一個由delete觸發多個執行語句的觸發器tb_delete,每次刪除記錄時,都把刪除的記錄的a字段的值賦值給用戶變量@old_value。@count記錄刪除的個數。

 

    【例3】定義了一個update觸發程序,用於檢查更新每一行時將使用的新值,並更改值,使之位於0~100的范圍內。

 

  3. 查看觸發器

    show triggers語句可以查看觸發器的狀態、語法等信息,但是因為不能查看指定的觸發器。

    查詢系統表information_schema.triggers表,這個方式可以查詢指定觸發器的指定信息,操作起來明顯方便得多。

    【例4】查詢名稱為tb1_insert的觸發器

 

  4. 刪除觸發器

    刪除觸發器語法格式:

       drop trigger [schema_name.]trigger_name觸發程序

    說明

      數據庫(schema_name)是可選的。如果省略了schema,將從當前數據庫中刪除觸發程序。

    【例5】刪除觸發器tb1_insert.

 

  5. 對觸發器的進一步說明

    下面是使用觸發器的一些限制:

      觸發器不能調用將數據返回客戶端的存儲過程,也不能使用采用call語句的動態sql。

      觸發器不能使用以顯式或隱式方式開始或結束事務的語句,如start transaction、commit或rollback。

    需要注意以下幾點:

      觸發器針對行來操作,因此當處理大數據集的時候可能效率很低。

      觸發器不能保證原子性。

 

7.2 事件的概念及管理

  1. 事件概念

    事件調度器(event scheduler):可以用做定時執行某些特定任務,可以精確到每秒鍾執行一個任務,而操作系統的計划任務只能精確到每分鍾執行一次。

    事件調度器有時也可稱為臨時觸發器(temporal triggers),因為事件調度器是基於特定時間周期觸發來執行某些任務,而觸發器(triggers)是基於某個表所產生的事件觸發的。

  2. 創建事件

     基本形式如下:

create event event_name                                                                           
on schedule schedule                                                                           
[on completion [not] preserve]                                                                           
[enable | disable | disable on slave]                                                                           
[comment 'comment']                                                                           
do event_body;                                                                           
schedule:                                                                           
at timestamp                                                                             
interval:                                                                           
quantity 

    【例6】創建一個立即啟動的事件,創建后查看學生信息如下:

 

 

    注意:在使用時間調度器這個功能之前必須確保event_scheduler已開啟。

    【例7】創建一個30秒后啟動的事件, 創建后查看學生信息如下:

 

 

  3. 修改事件

     修改事件的基本形式如下:

 

 alter event event_name [on schedule schedule]                                                                           
     [rename to new_event_name] [on completion [not] preserve]                                                                           
     [comment 'comment'] [enable | disable] [do sql_statement] 

    【例8】將事件direct的名字改成firstdirect。

 

 

  4. 刪除事件

    刪除事件基本形式:

drop event [if exists] event_name 

    說明

      如果事件不存在,會產生error 1513 (hy000): unknown event錯誤,因此最好加上if exists

    【例9】刪除名為thirtyseconds的事件。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM