Hỏi về code Trigger SQL

Xin chào các mọi người, tình hình là mình đang làm một bài tập c# liên quan đến quản lí điểm, nhưng khi mình xây dựng cơ sở dữ liệu thì gặp một số vấn đề khi xóa dữ liệu.


Ví dụ như trong hình trên, nếu mình muốn xóa một lớp trong bảng lớp thì sẽ phải xóa dữ liệu liên quan đến nó trong bản học viên, dẫn đến phải xóa dữ liệu liên quan đến bảng điểm. Vậy nên chắc phải dùng trigger,Nhưng mình hơi dở phần trigger nên mong được sự trợ giúp của mọi người. Hoặc mọi người có cách gì hay thì chỉ mình với được không
Cảm ơn mọi người trước

Bạn có thể dùng store thay vì trigger trong trường hợp này.
Ví dụ câu trên bạn có thể:

Create proc sp_deleteclass
(
@malop varchar()
) 
as
begin
Delete Diem where Mahv in (select Mahv from Hocvien where Malop = @malop)
Delete HocVien where Malop = @malop
Delete Lop = @malop
end
1 Like

Trong thực tế người ta ít khi XÓA thật sự dữ liệu trong bảng, thường chỉ là đánh dấu xóa mà thôi (vd thêm field DELETED, default =0, nếu delete thì bật lên =1 …)
Dữ liệu lịch sữ rất cần cho tra cứu, report, phân tích thống kê, BI, …

2.Nếu thật sự vẫn muốn xóa thì có 1 số cách như:

=>Dùng SQL, từ ứng dụng (vd: C# program)
Khi gọi delete sẽ gọi lần lượt 3 lệnh từ con nhất đến cha:

Delete from DIEM where mahv in (select mahv from hocvien where malop=X)
Delete from HOCVIEN where malop=X
Delete from LOP where malop=X

=>Dùng: ON DELETE CASCADE trên foreign key
Bạn thêm thuộc tính ON DELETE CASCADE trên FK của HoacVien và Diem.
Khi bạn xóa 1 Lop, tất cả các dữ liệu con có quan hệ sẽ được/bị xóa tự động.

Cách này thật sự ko khuyến khích sử dụng trên Production Database vì tất nguy hiểm !!!
Xem vd (tiếng Anh) trên SQL Server.

=>Dùng: TRigger

Thật sự viết Trigger ko qua khó, chỉ cần xem cú pháp tạo trigger, trong đó bỏ câu DELETE vào là xong. Trigger sẽ đặt trên table Lop và HocVien.

Cách này nếu làm đúng cũng sẽ có kết quả tương tự cách trên (ON DELETE CASCADE), khá là “nguy hiểm”.

1 Like

thiết kế lại csdl rồi xài on delete cascade

Lớp với Học Viên là quan hệ many-to-many thì nó phải có cái bảng riêng, ở đây là bảng Điểm, vậy thì bảng Điểm phải có mã hv và mã lớp. Làm sao Học Viên lại có mã lớp thế kia?? Mã lớp phải ở bên bảng Điểm mới đúng. Quăng nó qua bên Điểm xong rồi thì on delete cascade FK của Điểm, hợp logic: nếu Học Viên bị xóa thì tất cả Điểm của học viên đó cũng sẽ bị xóa, hoặc 1 Lớp bị xóa thì tất cả điểm số của lớp đó cũng bị xóa theo.

  1. Dùng cascade rule trong SQL để làm
  2. Dùng trigger(tự động): ref https://www.youtube.com/watch?v=x3XhV-iB57g&feature=youtu.be
  3. Dùng code(ở đây là C#) để làm: Nguyên tắc xóa: là xóa bảng nhiều trước, bỏ tất cả vào cùng 1 transaction, nếu lỗi ở bất kỳ đâu thì rollback
1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?