Hãy bắt đầu với tôi sẽ không bao giờ và tôi có nghĩa là không bao giờ gọi một proc được lưu trữ trong một trình kích hoạt. Để tính toán một chèn nhiều hàng, bạn sẽ phải trỏ qua trình tự. Điều này có nghĩa là 200.000 hàng bạn vừa tải thông qua truy vấn dựa trên tập hợp (giả sử cập nhật tất cả các giá thêm 10%) có thể khóa bảng trong nhiều giờ khi trình kích hoạt cố gắng xử lý tải một cách dũng cảm. Thêm vào đó, nếu có điều gì đó thay đổi trong proc, bạn có thể phá vỡ bất kỳ phần chèn nào vào bảng hoặc thậm chí treo bảng hoàn toàn. Tôi là một người tin tưởng chắc chắn rằng mã kích hoạt không nên gọi gì khác ngoài trình kích hoạt.
Cá nhân tôi thích chỉ đơn giản là làm nhiệm vụ của mình. Nếu tôi đã viết đúng các hành động mà tôi muốn thực hiện trong trình kích hoạt, nó sẽ chỉ cập nhật, xóa hoặc chèn vào nơi các cột đã thay đổi.
Ví dụ:giả sử bạn muốn cập nhật trường last_name mà bạn đang lưu trữ ở hai nơi do không chuẩn hóa được đặt ở đó vì lý do hiệu suất.
update t
set lname = i.lname
from table2 t
join inserted i on t.fkfield = i.pkfield
where t.lname <>i.lname
Như bạn có thể thấy, nó sẽ chỉ cập nhật các tên khác với tên hiện có trong bảng mà tôi đang cập nhật.
Nếu bạn muốn thực hiện kiểm tra và chỉ ghi lại những hàng đã thay đổi thì hãy thực hiện so sánh bằng cách sử dụng tất cả các trường giống như ở đâu i.field1 <> d.field1 hoặc i.field2 <> d.field3 (v.v. thông qua tất cả các trường)