觸發器—trigeer是資料庫下用於監視資料改變的某種情況,並觸發執行某種操作的乙個功能,簡單來說就是對某一張表符合某種條件的更改前或者後執行一段儲存過程。在這裡就簡單的說一說在mysql下如何使用觸發器。在使用mysql的觸發器可以檢查資料完整性、可以捕獲資料庫層中業務邏輯中的錯誤、對於有使用審計表中資料的更改非常有用,但是它的缺點是在使用會觸發器後只能提供擴充套件驗證,並且無法替換所有驗證,其次增加了後期維護成本,最後是在目前mysql下觸發器對伺服器的開銷增加比較大,建議在業務比較頻繁的表中不要使用大量的觸發器,在mysql中觸發器建立語法四要素:1.監視物件(大多都是對錶) 2.監視事件(insert/update/delete) 3.觸發時間(after/before) 4.觸發事件(insert/update/delete)。
首先,目前的mysql中在使用觸發器時能對某一張表進行insert、delete、update操作的前或者是後為條件從而觸發事先定義好的操作。這裡需要注意的是在使用mysql的觸發器時必須要有足夠大的許可權至少需要用super使用者的許可權,在預設條件下mysql的觸發器同function一樣普通使用者是無法進行操作的,如果需要賦予普通使用者建立觸發器的許可權需要在開啟log_bin_trust_function_creators變數:mysql> set global log_bin_trust_function_creators = on;#在配置好後在my.cnf或my.ini中新增
query ok, 0 rows affected (0.00 sec)
在該引數開啟後普通使用者就也可以建立觸發器和function,其次目前的mysql中觸發器僅支援dml並不支援ddl,其建立常用ddl語法如下:create trigger 觸發器名
after/before insert/update/delete on 表名 for each row #這句話在mysql是固定的
begin
dml語句;
end;
1、當使用insert語句的時候,如果原表中沒有資料的話,那麼對於插入資料後表來說新插入的那條資料就是new
2、當使用delete語句的時候,刪除的那一條資料相對於刪除資料後表的資料來說就是old
3、當使用update語句的時候,當修改原表資料的時候相對於修改資料後表的資料來說原表中修改的那條資料就是old,而修改資料後表被修改的那條資料就是new
所以在觸發器中使用new和old還是有區別的,在這裡用2張表說明下,有2張表tbl_name和tbl_name_log
tbl_name的ddl:drop table if exists `tbl_name`;
create table `tbl_name` (
`id` int(10) not null comment '姓名id',
`name` varchar(50) not null comment '姓名',
primary key (`id`)
) engine=innodb default charset=utf8;
tbl_name_log的ddl:drop table if exists `tbl_name_log`;
create table `tbl_name_log` (
`id` int(10) not null auto_increment comment '審計id',
`action` varchar(10) not null comment 'tbl_name表中執行的操作',
`name` varchar(50) not null comment '操作的姓名',
`time` datetime default null on update current_timestamp comment '操作時間',
primary key (`id`)
) engine=innodb auto_increment=1 default charset=utf8;
在tbl_name中分別對insert/update/delete三種事件後做出記錄於tbl_name_log表中,就可以在tbl_name新增3個觸發器:drop trigger if exists `audit_name_add`;
delimiter ;;
create trigger `audit_name_add` after insert on `tbl_name` for each row #在tbl_name插入後在tbl_name_log記錄日誌的觸發器
begin
insert into `tbl_name_log` (`action`,`name`,`time`)
values
('add',new.`name`,now());
enddelimiter ;
drop trigger if exists `audit_name_update`;
delimiter ;;
create trigger `audit_name_update` after update on `tbl_name` for each row #在tbl_name更新後在tbl_name_log記錄日誌的觸發器
begin
insert into `tbl_name_log` (`action`,`name`,`time`)
values
('update',new.`name`,now());
enddelimiter ;
drop trigger if exists `audit_name_del`;
delimiter ;;
create trigger `audit_name_del` after delete on `tbl_name` for each row #在tbl_name刪除後在tbl_name_log記錄日誌的觸發器
begin
insert into `tbl_name_log` (`action`,`name`,`time`)
values
('del',old.`name`,now());
enddelimiter ;
測試一下,在tbl_name表進行插入、更新、刪除後都會有相應的記錄於tbl_name_log表中
mysql觸發器的要素 MySQL觸發器
觸發器是一類特殊的事務,可以監視某種資料操作 insert,update,delete 並觸發相關操作 insert,update,delete 觸發器建立之四要素 監視地點 table 監視事件 insert,update,delete 觸發時間 after,before 觸發事件 insert,...
觸發器 mysql觸發器
觸發器是一種特殊的儲存過程,它在插入 刪除或修改特定表中的資料時觸發執行,它比資料庫本身標準的功能有更精細和更複雜的資料控制能力。和儲存過程一樣,很少使用。1 觸發器的作用 2 建立觸發器 建立測試環境 mysql create database test db query ok,1 row aff...
my sql 觸發器 mysql建立觸發器
首先,我們來了解一下什麼是觸發器,觸發器,就是在對一張表資料進行增 insert 刪 delete 改 update 的時候,為了保持資料的一致性,對別的表也要進行相應的資料修改。我們都知道mysql最後事務提交後,資料是會儲存到磁碟上的,那麼每次在insert,delete,update時候舊資料...