SỬ DỤNG TRIGGER TRONG SQL QUA VÍ DỤ CƠ BẢN.

Ngày đăng: Thứ Hai, 11/03/2019

Trigger là gì ?

Hiểu đơn giản thì Trigger là một stored procedure không có tham số. Trigger thực thi một cách tự động khi một trong ba câu lệnh Insert, Update, Delete làm thay đổi dữ liệu trên bảng có chứa trigger. 

Cú pháp của Trigger

CREATE TRIGGER tên_trigger ON tên_bảng
FOR {DELETE, INSERT, UPDATE}
AS 
  câu_lệnh_sql

Trigger dùng làm gì ?

  • Trigger thường được sử dụng để kiểm tra ràng buộc (check constraints) trên nhiều quan hệ (nhiều bảng/table) hoặc trên nhiều dòng (nhiều record) của bảng.
  • Ngoài ra việc sử dụng Trigger để chương trình có những hàm chạy ngầm nhằm phục vụ nhưng trường hợp hữu hạn và thường không sử dụng cho mục đích kinh doanh hoặc giao dịch. Đọc thêm tại đây

Bài toán đặt ra.

  • Bạn có 2 bảng kho hàng và đặt hàng liên kết với nhau bởi mã hàng.

  • Khi người dùng đặt hàng hãy tự động cập nhật số lượng tồn trong bảng kho hàng.

Giải pháp

  • Khi người dùng đặt hàng ta chỉ có 3 loại thao tác chính với CSDL là : Insert, Delete, Update
  • Vậy chỉ cần tạo 3 trigger tương ứng là ok 
  • Người dùng đặt hàngSố lượng còn trong kho = Số lượng còn - Số lượt đặt
  • Người dùng hủy không đặt hàng nữa: Số lượng còn trong kho = Số lượng còn + Số lượt đặt
  • Người dùng cập nhật Số lượng đặt => Số lượng còn tăng giảm tùy ý

Vấn đề

  • Ở 2 trường hợp insert và delete ta thực hiện bình thường. Nhưng trong trường hợp update Số lượng hàng tồn sẽ sảy ra trong 3 trường hợp sau.
  1. Số lượng đặt ban đầu = 5 sau đó tăng lên 10 => số lượng trong kho sẽ giảm 10 tương ứng
  2. Số lượng đặt lúc này = 10 sau đó giảm xuống 3 => số lượng trong kho sẽ tăng 7 tương ứng
  • Tận dụng việc trong sql câu lệnh update = Insert new row To Delete old row cõ nghĩa là khi thực hiện update CSDL trong sql sẽ chạy việc insert dữ liệu mới trước sau đó sẽ xóa đi bảng cũ.

Giải quyết vấn đề

  • Tận dụng việc sử dụng Trigger luôn tồn tại 2 bảng inserted và deleted ta sẽ rút ra 1 công thức cập nhật trung trong mọi trường hợp
SLTonKhoCu = SLTonKhoCu - inserted.SLDatHang + deleted.SLDatHang

Thực hiện qua ví dụ nhỏ

  1. Ban đầu thêm dữ liệu và select nó ra 

  1. Đặt hàng 5 sản phẩm với mã là 1

  1. Cập nhật lên 10

  1. Cập nhật về 3

  1. Cập nhật một số thông tin khác mà không liên quan đến số lượng

  1. Xóa đơn đặt hàng

Source code bài toàn 

  1. Trigger thêm

  1. Trigger Xóa

  1. Trigger Sửa


/* cập nhật hàng trong kho sau khi đặt hàng hoặc cập nhật */
CREATE TRIGGER trg_DatHang ON tbl_DatHang AFTER INSERT AS 
BEGIN
	UPDATE tbl_KhoHang
	SET SoLuongTon = SoLuongTon - (
		SELECT SoLuongDat
		FROM inserted
		WHERE MaHang = tbl_KhoHang.MaHang
	)
	FROM tbl_KhoHang
	JOIN inserted ON tbl_KhoHang.MaHang = inserted.MaHang
END
GO
/* cập nhật hàng trong kho sau khi cập nhật đặt hàng */
CREATE TRIGGER trg_CapNhatDatHang on tbl_DatHang after update AS
BEGIN
   UPDATE tbl_KhoHang SET SoLuongTon = SoLuongTon -
	   (SELECT SoLuongDat FROM inserted WHERE MaHang = tbl_KhoHang.MaHang) +
	   (SELECT SoLuongDat FROM deleted WHERE MaHang = tbl_KhoHang.MaHang)
   FROM tbl_KhoHang 
   JOIN deleted ON tbl_KhoHang.MaHang = deleted.MaHang
end
GO
/* cập nhật hàng trong kho sau khi hủy đặt hàng */
create TRIGGER trg_HuyDatHang ON tbl_DatHang FOR DELETE AS 
BEGIN
	UPDATE tbl_KhoHang
	SET SoLuongTon = SoLuongTon + (SELECT SoLuongDat FROM deleted WHERE MaHang = tbl_KhoHang.MaHang)
	FROM tbl_KhoHang 
	JOIN deleted ON tbl_KhoHang.MaHang = deleted.MaHang
END

Kết luận

Việc mà bạn sử dụng Trigger là không bắt buộc và chúng ta thường tưởng rằng vì thế mà chả ai dùng nó là hoàn toàn sai . Nhưng Trigger theo như mình tìm hiểu qua thì vẫn có rất nhiều nơi sẽ sử dụng nó vào mục đích riêng của họ.

Nguồn: Phạm Anh Tuấn/Viblo

CÁC TIN TỨC, SỰ KIỆN KHÁC


5 BÀI TOÁN LẬP TRÌNH MÀ BẤT KỂ LẬP TRÌNH VIÊN NÀO CŨNG CẦN CÓ KHẢ NĂNG GIẢI QUYẾT TRONG VÒNG 1 GIỜ
5 bài toán lập trình mà bất kể lập trình viên nào cũng cần có khả năng giải quyết trong vòng 1 giờ
Thứ Hai, 18/03/2019 bởi Techtalk via Viblo

Viết 3 hàm tính tổng của các số trong 1 dãy cho trước sử dụng for-loop, while-loop, và để quy.


BÁO CÁO MỚI NHẤT VỀ THỊ TRƯỜNG IT & TÌNH HÌNH NHÂN LỰC IT VIỆT NAM
Báo cáo mới nhất về thị trường IT & tình hình nhân lực IT Việt Nam
Thứ Năm, 14/03/2019 bởi Nguồn: Báo cáo của TopDev

Thị trường lao động riêng ngành lập trình sẽ cần 350.000 nhân lực đến trước cuối năm 2021 trong khi với khả năng hiện tại chỉ có khoảng 200.000 lao động đáp ứng được nhu cầu công việc.


ARENA MULTIMEDIA: ĐÒN BẨY SÁNG TẠO CHO NGƯỜI TRẺ VIỆT
Arena Multimedia: Đòn bẩy sáng tạo cho người trẻ Việt
Thứ Năm, 14/03/2019 bởi Theo Kênh14

Sự chuyển mình của ngành Mỹ Thuật Đa Phương Tiện Việt Nam (MTĐPT), với sự đồng hành của Arena Multimedia, không chỉ góp phần mang lại doanh thu tỷ đô mà còn tạo nên một thế hệ người trẻ đủ sức góp mặt trong những dự án đẳng cấp thế giới.


CODE CHALLENGE - SÂN CHƠI LẬP TRÌNH CHO SINH VIÊN MIỀN TRUNG
Code Challenge - Sân chơi lập trình cho sinh viên Miền Trung
Thứ Tư, 13/03/2019 bởi Softech Aptech

Code Challenge 2019 là một sân chơi công nghệ mới mẻ, mang đến loạt thử thách hấp dẫn cho các bạn sinh viên chuyên ngành IT. Cuộc thi lần đầu tiên được tổ chức có quy mô hoành tráng hàng đầu Miền Trung (phạm vi thí sinh toàn miền Trung) và vòng chung kết diễn ra tại Đà Nẵng.


APTECH ĐỘT PHÁ: HỌC HAI NĂM NHẬN HAI BẰNG LẬP TRÌNH QUỐC TẾ
Aptech đột phá: Học hai năm nhận hai bằng lập trình quốc tế
Thứ Tư, 13/03/2019 bởi Theo 24h

Hàng năm, nước ta có hàng ngàn sinh viên tốt nghiệp đại học ra trường, nhưng nhiều doanh nghiệp CNTT vẫn ca thán nhân sự ngành lập trình rất “thiếu và yếu”.Nên học lập trình ở đâu để ra trường làm được việc ngay? Đột phá với chương trình rút gọn, nhận song bằng quốc tế, đào tạo chú trọng nhu cầu doanh nghiệp, Aptech chính là lời giải cho bài toán nhân lực ngành CNTT.


SỬ DỤNG TRIGGER TRONG SQL QUA VÍ DỤ CƠ BẢN.
Sử dụng trigger trong SQL qua ví dụ cơ bản.
Thứ Hai, 11/03/2019 bởi Nguồn: Phạm Anh Tuấn/Viblo

Hiểu đơn giản thì Trigger là một stored procedure không có tham số. Trigger thực thi một cách tự động khi một trong ba câu lệnh Insert, Update, Delete làm thay đổi dữ liệu trên bảng có chứa trigger. 

XEM THÊM


KẾT NỐI VỚI CHÚNG TÔI