MySQL從5.0.2版開始引入觸發器,觸發器就是一個已命名的數據庫對象,這個對象和某張表 相關,而且當這張表發生某種特定事件後,觸發器將被激活執行相應的動作,觸發器允許這 些動作在這張表中的一行或多行的數據被操作的前後執行。在流行業務系統的處理過程中,開發和管理人員可以用觸發器來實現數據審計和其他安全相關的功能,如在運行中的數據執行加密功能。
舉個例子來說:一個客戶數據庫中包含客戶的社會保險號,企業的安全和審計人員必須將這些信息加密後存入磁盤。針對這種情況,管理員可以通過創建一個觸發器來自動獲取並加密這些數據然後再插入相應的數據庫表中。如下所示:
mysql> delimiter //
mysql> create trigger t_customer_insert before insert on customer
-> for each row
-> begin
-> set NEW.customer_ssn = aes_encrypt(NEW.customer_ssn,'password');
-> end;
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
mysql> insert into customer values (1,'fred','smith','456097234');
Query OK, 1 row affected (0.00 sec)
mysql> select * from customer;
結果顯示如下圖:
可以看出存在磁盤數據庫表中的社會保險號ssn已經變成加密後的不可讀亂碼格式。
另外MySQL5也引進了對游標的支持,在第一個發行版本中游標有向前翻閱結果集和不可執行數據更新語句的特點。游標可以用在MySQL5的新編碼對象,如存儲過程和觸發器,甚至是獨立的存儲過程邏輯塊中。以下是一個在存儲過程中的使用游標的簡單例子:
mysql> delimiter //
mysql> CREATE PROCEDURE cursor_demo()
-> BEGIN
-> DECLARE a, b CHAR(16);
-> DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1;
-> OPEN cur1;
-> REPEAT
-> FETCH cur1 INTO a,b;
-> UNDONE END REPEAT;
-> CLOSE cur1;
-> END
-> //
下面再舉一個觸發器的例子,該例子可以計算所有插入某表的某個列中的數值的和:
mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));
mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account
-> FOR EACH ROW SET @sum = @sum + NEW.amount;可見觸發器功能可以提高管理人員管理數據庫的靈活性。