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的事件。