+3

Trigger in Mysql

trigger.png

I. Trigger là gì?

Trigger là một đối tượng được định danh trong CSDL và được gắn chặt với một sự kiện xảy ra trên một bảng nào đó (điều này có nghĩa là nó sẽ được tự động thực thi khi xảy ra một sự kiện trên một bảng). Các sự kiện này bao gồm: INSERT, UPDATE hay DELETE một bảng.

Trigger được đưa vào MySQL từ phiên bản 5.0.2

II. Tại sao lại sử dụng Trigger?

Trigger được thực thi tự động khi xuất hiện một hành động thay đổi trong bảng, nên người ta có thể ứng dụng trigger để tạo ra các công việc tự động thay cho việc phải làm thủ công bằng tay như: kiểm tra dữ liệu, đồng bộ hóa dữ liệu, đảm bảo các mối quan hệ giữa các bảng...

III. Ưu nhược điểm của trigger

- Ưu điểm:

– Dễ dàng kiểm tra tính toàn vẹn của csdl. – Trigger có thể bắt lỗi logic nghiệp vụ (business logic) ở mức csdl.

– Có thể dùng trigger là một cách khác để thay thế việc thực hiện những công việc hẹn theo giờ theo lịch.

– Trigger rất hiệu quả khi được sử dụng để kiểm soát những thay đổi của dữ liệu trong bảng.

- Nhược điểm:

– Trigger chỉ là một phần mở rộng của việc kiểm tra tính hợp lệ của dữ liệu chứ không thay thế được hoàn toàn công việc này.

– Trigger hoạt động ngầm ở trong csdl, không hiển thị ở tầng giao diện. Do đó, khó chỉ ra được điều gì xảy ra ở tầng csdl.

– Trigger thực hiện các update lên bảng dữ liệu vì thế nó làm gia tăng lượng công việc lên csdl và làm cho hệ thống chạy chậm.

IV. Hoạt động của trigger trong MySQL

Khi bạn tạo ra một trigger trong MySQL thì định nghĩa của nó được lưu trong tập tin có phần mở rộng là ‘.TRG’ tại thư mục của csdl.

/data_folder/database_name/table_name.trg

Chúng ta có thể mở ra và chỉnh sửa.

Một số giới hạn cần chú ý khi sử dụng trigger:

  • Không thể gọi thủ tục thường trú từ trigger

  • Không thể tạo ra trigger theo dõi bảng ảo hay bảng tạm

  • Không thể sử dụng giao tác (transaction) trong trigger.

  • Trigger không cho phép sử dụng lệnh RETURN.

  • Sử dụng trigger sẽ làm ảnh hưởng đến bộ nhớ tạm danh cho lệnh truy vấn.

  • Tất cả các trigger của csdl không được trùng tên.

V. Tạo trigger

Cú pháp:

CREATE TRIGGER trigger_name trigger_time trigger_event

 ON table_name

 FOR EACH ROW

 BEGIN

 ...

 END

Giải thích:

  • CREATE TRIGGER dùng để tạo các trigger

  • Trigger_name là tên của trigger được đặt theo trình tự [trigger time][table name][trigger event]

    ví dụ: before_products_update

  • Trigger_time là thời điểm kích hoạt trigger.

    • BEFORE: khi bạn muốn xử lý trước khi thực hiện thay đổi trên bảng dữ liệu.

    • AFTER: thay đổi trên bảng dữ liệu trước rồi mới xử lý sau.

  • Trigger_event là theo dõi các sự kiện nào. Nó có 3 lựa chọn INSERT, UPDATE hoặc DELETE.. Mỗi trigger chỉ theo dõi được một sự kiện duy nhất.

  • Mỗi trigger phải gắn liền với một bảng dữ liệu được chỉ ra sau từ khóa ON.

  • Phần thân của trigger nằm trong khối lệnh BEGIN…END

  • Từ khóa OLD chỉ đến dòng dữ liệu đang tồn tại trước khi thực hiện thao tác chỉnh sửa. Từ khóa NEW chỉ đến dòng dữ liệu mới xuất hiện sau khi thực hiện thao tác chỉnh sửa.

Chúng ta đã có bảng products trong csdl với cấu trúc như sau:

-- ----------------------------
-- Table structure for products
-- ----------------------------
DROP TABLE IF EXISTS `products`;
CREATE TABLE `products` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `content` text COLLATE utf8_unicode_ci,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

-- ----------------------------
-- Records of products
-- ----------------------------
INSERT INTO `products` VALUES ('1', 'Apple', 'This is Apple');
INSERT INTO `products` VALUES ('2', 'Samsung', 'This is Samsung');
INSERT INTO `products` VALUES ('3', 'Nokia', 'This is Nokia');
INSERT INTO `products` VALUES ('4', 'Microsoft', 'This is Microsoft');

Viết trigger, bất cứ khi nào xảy ra việc thay đổi dữ liệu trên bảng products thì những thay đổi đó sẽ được ghi nhận và được đưa vào lưu ở một bảng khác. Chúng ta tạo một bảng mới thực hiện chức năng này với cấu trúc như sau:

DROP TABLE IF EXISTS `products_tmp`;
CREATE TABLE `products_tmp` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `content` text COLLATE utf8_unicode_ci,
  `date` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Để theo dõi nhưng thay đổI chỉnh sửa của products chúng ta tạo ra một trigger theo dõi lệnh update trên trường dữ liệu này.

DROP TRIGGER IF EXISTS before_product_update;
DELIMITER $$

 CREATE TRIGGER before_product_update

 BEFORE UPDATE ON products

 FOR EACH ROW

BEGIN

 INSERT INTO products_tmp

SET

 title = OLD.title,

 content = OLD.content,

 date = NOW();

END$$

 DELIMITER ;

Bây giờ chúng ta test thử câu lệnh update:

UPDATE products set title = 'Apple change' WHERE id = '1';

sau đó ta thấy table products đã thay đổi

SELECT * FROM `products`;

Screenshot_4.png

và table products_tmp đã lưu item đã chỉnh sửa.

SELECT * FROM `products_tmp`;

Screenshot_5.png

oke, vậy là trigger đã tạo thành công.

VI. Quản lý trigger trong MySQL

Quản lý các trigger được tạo ra trong csdl là một thao tác cần nắm vững. MySQL cho phép chúng ta xem danh sách các trigger có trong csdl bằng các câu lệnh sau:

  • Để xóa trigger ta sử dụng câu lệnh sau
 DROP TRIGGER table_name.trigger_name
  • Show all các trigger
 SHOW TRIGGERS;

Screenshot_6.png

KL: Việc quản lý data có dung lượng lớn không hề đơn giản, không phải ai cũng sử dụng 1 cách thuần thục. Rất có thể sẽ có người xóa nhầm trong CSDL, Sẽ gây ảnh hưởng không nhỏ, nếu dữ liệu đó quan trọng. Dùng trigger có thể lấy lại những dữ liệu đã bị xóa. Có thể theo dõi ai đó xóa, sửa, xóa ngày nào , giờ nào. Tuy nhiên chúng ta cũng cần lưu ý, tạo nhiều Trigger thực hiện các update lên bảng dữ liệu nó làm gia tăng lượng công việc lên csdl và làm cho hệ thống chạy chậm.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí