SQL Triggers và khi hoặc khi không sử dụng chúng.


43

Khi tôi ban đầu tìm hiểu về SQL, tôi luôn được thông báo, chỉ sử dụng các kích hoạt nếu bạn thực sự cần và chọn sử dụng các thủ tục được lưu trữ thay thế nếu có thể.

Thật không may vào thời điểm đó (một vài năm trước đây) tôi không tò mò và quan tâm đến các nguyên tắc cơ bản như bây giờ nên không bao giờ hỏi lý do tại sao.

Ý kiến ​​của cộng đồng trong vấn đề này là gì? Có phải đó chỉ là sở thích cá nhân của ai đó, hay nên tránh các yếu tố kích hoạt (giống như con trỏ) trừ khi có lý do chính đáng cho họ.


Câu trả lời:


32

Các bài viết trên Wikipedia về cơ sở dữ liệu trigger quà một cái nhìn tổng quan tốt về những gì gây nên là gì và khi nào thì sử dụng chúng trong cơ sở dữ liệu khác nhau.

Các cuộc thảo luận sau chỉ dựa trên SQL Server.

Sử dụng kích hoạt là khá hợp lệ khi sử dụng của họ là hợp lý. Ví dụ, chúng có giá trị tốt trong kiểm toán (lưu giữ lịch sử dữ liệu) mà không yêu cầu mã thủ tục rõ ràng với mỗi lệnh CRUD trên mỗi bảng.

Kích hoạt cho phép bạn kiểm soát ngay trước khi dữ liệu được thay đổi và ngay sau khi dữ liệu được thay đổi. Điều này cho phép:

  • Kiểm toán như đã đề cập trước đó
  • Xác nhận và kiểm tra an ninh kinh doanh nếu muốn. Do loại điều khiển này, bạn có thể thực hiện các tác vụ như định dạng cột trước và sau khi chèn vào cơ sở dữ liệu.

Tôi luôn được thông báo, chỉ sử dụng các kích hoạt nếu bạn thực sự cần và chọn sử dụng các thủ tục được lưu trữ thay thế nếu có thể.

Có thể một số lý do cho việc này là:

  1. Một số chức năng kích hoạt được sử dụng để làm ngày xưa giờ đây có thể được thực hiện theo các cách khác như cập nhật tổng số và tính toán tự động trên một cột.
  2. Bạn không thấy nơi kích hoạt được gọi bằng cách kiểm tra mã một mình mà không biết chúng tồn tại. Bạn thấy tác dụng của chúng khi bạn thấy dữ liệu thay đổi và đôi khi rất khó hiểu tại sao thay đổi xảy ra trừ khi bạn biết có một trình kích hoạt hoặc tác động nhiều hơn trên (các) bảng.
  3. Nếu bạn sử dụng một số điều khiển cơ sở dữ liệu như CHECK, RI, Triggers trên một số bảng, luồng chi tiết giao dịch của bạn sẽ trở nên phức tạp để hiểu và duy trì. Bạn sẽ cần phải biết chính xác những gì xảy ra khi. Một lần nữa, bạn sẽ cần tài liệu tốt cho việc này.

Một số khác biệt giữa các trình kích hoạt và các thủ tục được lưu trữ không kích hoạt là (trong số các thủ tục khác):

  • Một thủ tục được lưu trữ không kích hoạt giống như một chương trình phải được gọi một cách rõ ràng từ mã hoặc từ một trình lập lịch hoặc từ một công việc hàng loạt, v.v. để thực hiện công việc của nó, trong khi đó một kích hoạt là một loại thủ tục được lưu trữ đặc biệt kích hoạt như một phản hồi của một sự kiện chứ không phải được thực hiện trực tiếp bởi người dùng. Sự kiện có thể là một sự thay đổi dữ liệu trong một cột dữ liệu chẳng hạn.
  • Kích hoạt có các loại. DDL Triggers và DML Triggers (có các loại: INSTEAD OF, For và AFTER)
  • Các thủ tục được lưu trữ không kích hoạt có thể tham chiếu bất kỳ loại đối tượng nào, tuy nhiên, để tham chiếu một khung nhìn, bạn phải sử dụng các trình kích hoạt INSTEAD OF.
  • Trong SQLServer, bạn có thể có bất kỳ số nào trong các thủ tục được lưu trữ không kích hoạt nhưng chỉ có 1 trình kích hoạt INSTEAD OF trên mỗi bảng.

8

Kích hoạt là một yêu cầu cho bất kỳ quy tắc toàn vẹn dữ liệu phức tạp. Chúng không thể được thực thi ở bất cứ đâu ngoại trừ cơ sở dữ liệu hoặc bạn sẽ gặp vấn đề về tính toàn vẹn dữ liệu.

Chúng cũng là nơi tốt nhất để kiểm toán trừ khi bạn không muốn nắm bắt tất cả các thay đổi đối với cơ sở dữ liệu (đó là vấn đề kiểm toán từ ứng dụng).

Kích hoạt có thể gây ra vấn đề hiệu suất nếu không được viết cẩn thận và không đủ nhà phát triển đủ hiểu biết để viết chúng tốt. Đây là một phần trong đó họ có được bản rap tệ.

Kích hoạt thường chậm hơn các phương tiện khác để duy trì tính toàn vẹn dữ liệu, vì vậy nếu bạn có thể sử dụng ràng buộc kiểm tra, hãy sử dụng thay vì kích hoạt.

Thật dễ dàng để viết các trình kích hoạt xấu làm những việc ngu ngốc như cố gắng gửi email. Bạn có thực sự muốn không thể thay đổi các bản ghi trong db nếu máy chủ email bị hỏng không?

Trong máy chủ SQL, các trình kích hoạt hoạt động trên một loạt các bản ghi. Tất cả các nhà phát triển thường nghĩ rằng họ chỉ cần xử lý một bản ghi, cập nhật hoặc xóa bản ghi. Đó không phải là loại thay đổi dữ liệu duy nhất xảy ra với cơ sở dữ liệu và tất cả các kích hoạt nên được kiểm tra theo các điều kiện của 1 thay đổi bản ghi và nhiều thay đổi bản ghi. Việc quên làm bài kiểm tra thứ hai có thể dẫn đến các trình kích hoạt hoạt động cực kỳ kém hoặc mất tính toàn vẹn dữ liệu.


3

Sử dụng kích hoạt cơ sở dữ liệu

  1. Để lái các giá trị cột tự động.
  2. Để thực thi các ràng buộc toàn vẹn phức tạp.
  3. Để thực thi các quy tắc kinh doanh phức tạp.
  4. Để tùy chỉnh ủy quyền bảo mật phức tạp.
  5. Để duy trì bảng sao chép.
  6. Để kiểm toán sửa đổi dữ liệu.

2

Một trường hợp sử dụng khác mà cá nhân tôi gặp phải là cho các cơ sở dữ liệu được truy cập bởi nhiều hơn một chương trình. Nếu bạn muốn thực hiện chức năng nhưng không thiết kế lại tất cả các hệ thống cho nó, một bộ kích hoạt tạo ra một giải pháp hợp lý.

Ví dụ, gần đây tôi đã làm việc trên một cơ sở dữ liệu mà trước đây chỉ tồn tại như một hệ thống văn phòng. Khi một ứng dụng web được viết để giao tiếp với nó, chúng tôi muốn triển khai một hệ thống thông báo (ví dụ như stackexchange), sẽ được kích hoạt bởi nhiều sự kiện, chẳng hạn như xử lý một giao dịch, v.v. Chúng tôi đã có thể triển khai một trình kích hoạt để các cập nhật trong phần phụ trợ văn phòng kích hoạt một trình kích hoạt để tạo thông báo cho giao diện và thông báo cho người dùng rằng giao dịch của họ đã được văn phòng xử lý.


1

Các kích hoạt có thể được sử dụng để thực thi các ràng buộc trên cơ sở dữ liệu không thể được thi hành trong quá trình tạo lược đồ cơ sở dữ liệu và bất kỳ câu lệnh DML nào.


0

Hãy nói rằng bạn cần đẩy dữ liệu lên hệ thống bên thứ 3 trong thời gian gần. Bảng của bạn chứa 950 gigabyte dữ liệu, vì vậy nó quá lớn khi chỉ cần đẩy toàn bộ bảng sang ứng dụng bên thứ 3.

Thay vào đó bạn tích lũy thay đổi trong một hàng đợi. Một số chương trình bên ngoài sau đó sẽ định kỳ đẩy ra các lô dữ liệu xếp hàng nhỏ.

Hệ thống có hơn 2000 thủ tục lưu trữ. Bạn cũng biết rằng hàng tấn sql tồn tại trong mã nguồn. Để đảm bảo hàng đợi được điền chính xác, bạn sẽ phải tìm kiếm trong tất cả các mã và mã được lưu trữ và hy vọng bạn không bỏ lỡ bất cứ điều gì.

Thay vào đó, bạn có thể đặt một kích hoạt trên bàn để giữ cho hàng đợi được cập nhật. Đảm bảo không bỏ lỡ bất cứ điều gì. Một địa điểm trung tâm. Hiệu suất phạt? Không thực sự bởi vì cú đánh của dân cư hàng đợi không thể tránh được dù là do kích hoạt hay bên ngoài.

Trong kịch bản này, tôi sẽ nói không sử dụng kích hoạt là một lựa chọn thiết kế tồi. Nếu sau này bạn muốn sử dụng một phương pháp đẩy dữ liệu mới (giả sử hàng đợi không hoạt động) và giao diện thay đổi bạn được bảo vệ nếu bạn sử dụng kích hoạt. Triggers thường là sự lựa chọn tốt nhất. Đừng nghe những fanboy chống kích hoạt giáo điều.


Nhưng chắc chắn có nhiều điều KHÔNG nên được thực hiện với một kích hoạt.
Lord Tydus

-6

Một kích hoạt gửi email không nhất thiết là một ý tưởng 'ngu ngốc'. Điều ngu ngốc là không lường trước được sự cố mất email trong thiết kế và xử lý nó một cách duyên dáng với việc mất dữ liệu. Phần 'ngu ngốc' của điều này thực sự tồi tệ đối với việc xử lý lỗi không tồn tại của các nhà phát triển lười biếng, những người cảm thấy họ miễn nhiễm với việc mắc lỗi.

Tôi cũng sẽ đưa ra quan sát rằng một trình kích hoạt có thể được giữ đơn giản bằng cách gọi một thủ tục / hàm được lưu trữ có thể phức tạp tùy ý và có thể được sử dụng lại bởi nhiều trình kích hoạt hoặc các thủ tục được lưu trữ khác. Đó là lý do tại sao có các gói và thư viện.

Bigotry thực sự làm tê liệt.


1
Tôi không thấy bất cứ nơi nào trong câu hỏi mà từ "email" được đề cập. Có lẽ bạn đang cố gắng trả lời một câu trả lời khác? Stack Exchange không phải là một diễn đàn .
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.