01/10/2018, 14:13
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ài liên quan
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ể:
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”.
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.