MySQL Triggers là gì? Hướng dẫn tạo bảng History sử dụng MySQL Triggers


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

  1. CREATE TABLE data (
  2. id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  3. fullname VARCHAR(255) NOT NULL,
  4. website VARCHAR(255) NOT NULL,
  5. created_date TIMESTAMP,
  6. updated_date TIMESTAMP
  7. );
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

  1. CREATE TABLE data_history (
  2. data_history_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  3. data_id INT UNSIGNED NOT NULL,
  4. fullname VARCHAR(255) NOT NULL,
  5. website VARCHAR(255) NOT NULL,
  6. created_date TIMESTAMP,
  7. updated_date TIMESTAMP
  8. );
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

  1. DELIMITER $$
  2. CREATE TRIGGER data_insert_history
  3. AFTER INSERT ON data
  4. FOR EACH ROW
  5. BEGIN
  6. INSERT INTO data_history (
  7. data_id,
  8. fullname,
  9. website,
  10. created_date,
  11. updated_date
  12. )
  13. VALUES(
  14. NEW.data_id,
  15. NEW.fullname,
  16. NEW.website,
  17. NEW.created_date,
  18. NEW.updated_date
  19. );
  20. END$$
  21. 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 ;
  1. DELIMITER $$
  2. CREATE TRIGGER data_update_history
  3. AFTER UPDATE ON data
  4. FOR EACH ROW
  5. BEGIN
  6. INSERT INTO data_history (
  7. data_id,
  8. fullname,
  9. website,
  10. created_date,
  11. updated_date
  12. )
  13. VALUES(
  14. NEW.data_id,
  15. NEW.fullname,
  16. NEW.website,
  17. NEW.created_date,
  18. NEW.updated_date
  19. );
  20. END$$
  21. 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 ;
  1. DELIMITER $$
  2. CREATE TRIGGER data_delete_history
  3. AFTER DELETE ON data
  4. FOR EACH ROW
  5. BEGIN
  6. INSERT INTO data_history (
  7. data_id,
  8. fullname,
  9. website,
  10. created_date,
  11. updated_date,
  12. deleted_date
  13. )
  14. VALUES(
  15. OLD.data_id,
  16. OLD.fullname,
  17. OLD.website,
  18. OLD.created_date,
  19. OLD.updated_date,
  20. NOW()
  21. );
  22. END$$
  23. 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

  1. INSERT INTO `data` (`data_id`, `fullname`, `website`) VALUES ('1', 'Nguyen Van A', 'https://vinasupport.com');
  2. UPDATE `data` SET `fullname`='Nguyen Van B' WHERE `data_id`='1';
  3. 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

             
SHARE

Bài viết liên quan

mode_edit Bình luận của bạn

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

account_circle
web