MySQL Triggers là gì?
MySQL Triggers là một đối tượng CSDL trong MySQL được liên kết với một bảng. Khi một sự kiện INSERT, UPDATE, DELETE xảy ra trong bảng CSDL thì Trigger sẽ được kích hoạt và thực thi một nhiệm vụ mà bạn mong muốn. Triggers có thể được kích hoạt trước và sau khi sự kiện đó được thực hiện.
Để hiểu thêm về định nghĩa, các bạn vui lòng tham khảo tài liệu chính thống của MySQL.
Yêu cầu chính để chạy MySQL Triggers là có các đặc quyền của MySQL SUPERUSER. Vì vậy để có thể sử dụng MySQL Triggers các bạn không nên sử dụng Shared Hosting, mà hãy sử dụng VPS Hosting (Virmach, HostUS) hoặc Cloud Hosting (Vultr, DigitalOcean, Linode)
Hướng dẫn tạo bảng History sử dụng MySQL Triggers
Một ví dụ cho cách sử dụng Triggers trong MySQL là tạo 1 bảng History để lưu lại lịch sử thay đổi của 1 bảng CSDL.
– Đầu tiên chúng ta tạo một bảng có tên là data chứa dữ liệu người dùng
CREATE TABLE data (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
fullname VARCHAR(255) NOT NULL,
website VARCHAR(255) NOT NULL,
created_date TIMESTAMP,
updated_date TIMESTAMP
);
- CREATE TABLE data (
- id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
- fullname VARCHAR(255) NOT NULL,
- website VARCHAR(255) NOT NULL,
- created_date TIMESTAMP,
- updated_date TIMESTAMP
- );
CREATE TABLE data (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
fullname VARCHAR(255) NOT NULL,
website VARCHAR(255) NOT NULL,
created_date TIMESTAMP,
updated_date TIMESTAMP
);
– Tạo một bảng khác sử dụng để lưu lịch sử thay đổi của bảng data là bảng data_history
CREATE TABLE data_history (
data_history_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
data_id INT UNSIGNED NOT NULL,
fullname VARCHAR(255) NOT NULL,
website VARCHAR(255) NOT NULL,
created_date TIMESTAMP,
updated_date TIMESTAMP
);
- CREATE TABLE data_history (
- data_history_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
- data_id INT UNSIGNED NOT NULL,
- fullname VARCHAR(255) NOT NULL,
- website VARCHAR(255) NOT NULL,
- created_date TIMESTAMP,
- updated_date TIMESTAMP
- );
CREATE TABLE data_history (
data_history_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
data_id INT UNSIGNED NOT NULL,
fullname VARCHAR(255) NOT NULL,
website VARCHAR(255) NOT NULL,
created_date TIMESTAMP,
updated_date TIMESTAMP
);
– Tạo MySQL Triggers cho từng sự kiện INSERT, UPDATE, DELETE trên bảng data
DELIMITER $$
CREATE TRIGGER data_insert_history
AFTER INSERT ON data
FOR EACH ROW
BEGIN
INSERT INTO data_history (
data_id,
fullname,
website,
created_date,
updated_date
)
VALUES(
NEW.data_id,
NEW.fullname,
NEW.website,
NEW.created_date,
NEW.updated_date
);
END$$
DELIMITER ;
- DELIMITER $$
- CREATE TRIGGER data_insert_history
- AFTER INSERT ON data
- FOR EACH ROW
- BEGIN
- INSERT INTO data_history (
- data_id,
- fullname,
- website,
- created_date,
- updated_date
- )
- VALUES(
- NEW.data_id,
- NEW.fullname,
- NEW.website,
- NEW.created_date,
- NEW.updated_date
- );
- END$$
- DELIMITER ;
DELIMITER $$
CREATE TRIGGER data_insert_history
AFTER INSERT ON data
FOR EACH ROW
BEGIN
INSERT INTO data_history (
data_id,
fullname,
website,
created_date,
updated_date
)
VALUES(
NEW.data_id,
NEW.fullname,
NEW.website,
NEW.created_date,
NEW.updated_date
);
END$$
DELIMITER ;
DELIMITER $$
CREATE TRIGGER data_update_history
AFTER UPDATE ON data
FOR EACH ROW
BEGIN
INSERT INTO data_history (
data_id,
fullname,
website,
created_date,
updated_date
)
VALUES(
NEW.data_id,
NEW.fullname,
NEW.website,
NEW.created_date,
NEW.updated_date
);
END$$
DELIMITER ;
- DELIMITER $$
- CREATE TRIGGER data_update_history
- AFTER UPDATE ON data
- FOR EACH ROW
- BEGIN
- INSERT INTO data_history (
- data_id,
- fullname,
- website,
- created_date,
- updated_date
- )
- VALUES(
- NEW.data_id,
- NEW.fullname,
- NEW.website,
- NEW.created_date,
- NEW.updated_date
- );
- END$$
- DELIMITER ;
DELIMITER $$
CREATE TRIGGER data_update_history
AFTER UPDATE ON data
FOR EACH ROW
BEGIN
INSERT INTO data_history (
data_id,
fullname,
website,
created_date,
updated_date
)
VALUES(
NEW.data_id,
NEW.fullname,
NEW.website,
NEW.created_date,
NEW.updated_date
);
END$$
DELIMITER ;
DELIMITER $$
CREATE TRIGGER data_delete_history
AFTER DELETE ON data
FOR EACH ROW
BEGIN
INSERT INTO data_history (
data_id,
fullname,
website,
created_date,
updated_date,
deleted_date
)
VALUES(
OLD.data_id,
OLD.fullname,
OLD.website,
OLD.created_date,
OLD.updated_date,
NOW()
);
END$$
DELIMITER ;
- DELIMITER $$
- CREATE TRIGGER data_delete_history
- AFTER DELETE ON data
- FOR EACH ROW
- BEGIN
- INSERT INTO data_history (
- data_id,
- fullname,
- website,
- created_date,
- updated_date,
- deleted_date
- )
- VALUES(
- OLD.data_id,
- OLD.fullname,
- OLD.website,
- OLD.created_date,
- OLD.updated_date,
- NOW()
- );
- END$$
- DELIMITER ;
DELIMITER $$
CREATE TRIGGER data_delete_history
AFTER DELETE ON data
FOR EACH ROW
BEGIN
INSERT INTO data_history (
data_id,
fullname,
website,
created_date,
updated_date,
deleted_date
)
VALUES(
OLD.data_id,
OLD.fullname,
OLD.website,
OLD.created_date,
OLD.updated_date,
NOW()
);
END$$
DELIMITER ;
Kết quả:
Thử test với câu lệnh Insert, update và delete
INSERT INTO `data` (`data_id`, `fullname`, `website`) VALUES ('1', 'Nguyen Van A', 'https://vinasupport.com');
UPDATE `data` SET `fullname`='Nguyen Van B' WHERE `data_id`='1';
DELETE FROM `data` WHERE `data_id`='1';
- INSERT INTO `data` (`data_id`, `fullname`, `website`) VALUES ('1', 'Nguyen Van A', 'https://vinasupport.com');
- UPDATE `data` SET `fullname`='Nguyen Van B' WHERE `data_id`='1';
- DELETE FROM `data` WHERE `data_id`='1';
INSERT INTO `data` (`data_id`, `fullname`, `website`) VALUES ('1', 'Nguyen Van A', 'https://vinasupport.com');
UPDATE `data` SET `fullname`='Nguyen Van B' WHERE `data_id`='1';
DELETE FROM `data` WHERE `data_id`='1';
Kết quả sau khi Test trên bảng data_history