Khôn ngoan để sử dụng kích hoạt để cập nhật một bảng khác?


8

Tôi có một Objectbảng được điền từ dịch vụ Tích hợp ( tôi có thể thay đổi nếu cần ) từ cơ sở dữ liệu khác. Tại một số điểm nhất định, chúng tôi cần thêm thủ công các bài đăng trong một bảng khác ObjectObjectGroup (ObjectId, ObjectGroupId)cần thiết nếu Object.ObjectTypecó một giá trị nguyên nhất định. Vì dịch vụ tích hợp không xử lý loại cập nhật đó, tôi nghĩ đến việc thêm một trình kích hoạt vào bảng Object mà mã giả sẽ như sau:

if Object.ObjectType = 10
    begin
        if Object.ObjectNumber like '<string pattern>'
        begin
            insert into ObjectObjectGroup values...
        end
    end

Là thiết lập này khôn ngoan, hoặc có một cách tốt hơn về hiệu suất?

Câu trả lời:


9

Chủ yếu là Sao chép / Dán câu trả lời của tôi từ câu hỏi này trên stackoverflow

Kích hoạt có thể rất lôi cuốn, khi bạn lần đầu tiên bắt đầu sử dụng chúng, chúng có vẻ giống như một viên đạn ma thuật cho tất cả các loại vấn đề. Tuy nhiên, chúng làm cho các công cụ "ma thuật" xảy ra, nếu bạn không biết cơ sở dữ liệu từ bên ngoài, có vẻ như những điều thực sự kỳ lạ xảy ra (chẳng hạn như chèn vào các bảng khác, thay đổi dữ liệu đầu vào, v.v.). Trước khi triển khai mọi thứ như một trình kích hoạt, tôi nghiêm túc xem xét thay vì thực thi việc sử dụng API xung quanh lược đồ (tốt nhất là trong cơ sở dữ liệu, nhưng bên ngoài nếu bạn không thể).

Một số thứ tôi vẫn sử dụng kích hoạt cho

  • Theo dõi các trường "date_created" và "date_last_edited"
  • Chèn "ID" (trong orory, nơi không có trường id tự động)
  • Giữ lịch sử thay đổi

Những thứ bạn không muốn sử dụng kích hoạt cho

  • quy tắc kinh doanh / logic
  • bất cứ thứ gì kết nối bên ngoài cơ sở dữ liệu (ví dụ: một cuộc gọi dịch vụ web)
  • Kiểm soát truy cập
  • Bất cứ điều gì không phải là giao dịch (bất cứ điều gì bạn làm trong trình kích hoạt PHẢI có thể quay lại với giao dịch)

4

Vâng, đó là khôn ngoan. Đó thực sự là mục đích của trình kích hoạt, để thực hiện các hành động cần thiết sau thao tác chèn / cập nhật / xóa trên bảng.

Bạn cần tính đến thực tế là một trình kích hoạt trong MS SQL sẽ không xử lý riêng từng hàng, nhưng sẽ xử lý tất cả các hàng của giao dịch hiện tại cùng một lúc. Vì vậy, nếu một thao tác sẽ chèn 10 hàng cùng một lúc, bạn sẽ cần nghĩ mã kích hoạt của mình để xử lý tất cả các hàng cùng một lúc.


1
Miễn là dịch vụ tạo ra cơ sở dữ liệu không làm tất cả những gì người đàn ông cần và miễn là anh ta không thể thay đổi dịch vụ (đó là cảm giác của tôi sau khi mô tả), và câu hỏi là ở đây trên DBA.SE, không phải trên các lập trình viên , Tôi sẽ nói rằng một trình kích hoạt được ghi chép tốt không nên có vấn đề gì. Anh ấy nói anh ấy đang làm một số thứ thủ công, vì vậy việc thay đổi mã không thể liên quan đến những gì tôi hiểu ..
Marian

1
Trong trường hợp này, nó có thể là lựa chọn khả thi duy nhất, điều đó không làm cho nó trở nên khôn ngoan. Điều khôn ngoan cần làm là đẩy lùi nhà phát triển ứng dụng và khiến họ chèn chính xác vào cả hai bảng.
Matthew Watson

ho . Tôi thấy nơi này đang hướng tới. Xin lỗi vì ong không rõ ràng trong câu hỏi của tôi ở trên. Tôi có khả năng thay đổi dịch vụ tích hợp, ngay cả khi nó không thuộc sở hữu của tôi. Từ những gì tôi có thể đọc, tốt hơn là thay đổi dịch vụ tích hợp và chỉ sử dụng các kích hoạt cho dịch vụ ghi lại lịch sử / kiểm toán.
Benny Skogberg

3

Triggers là một công cụ mạnh mẽ, và giống như bất kỳ công cụ nào khác bạn cần cẩn thận khi sử dụng chúng.

  1. Khi bạn mắc lỗi trong trình kích hoạt, mọi thứ có thể trở nên sai lầm và trừ khi bạn đang chạy dấu vết, bạn sẽ không nhận ra ...

  2. Họ thay đổi / chèn / xóa dữ liệu một cách kỳ diệu mà người dùng DB (ứng dụng hiện tại / bất kỳ ứng dụng nào trong tương lai / nhà phát triển thực hiện cập nhật một lần) không nhận ra / có ý định.

Vấn đề lớn là sau khi bạn tạo trình kích hoạt, không rõ ràng đối với các nhà phát triển / người dùng khác rằng trình kích hoạt thậm chí còn ở đó và những gì nó làm.

Điều đó nói rằng, chúng là một công cụ tuyệt vời để duy trì tính toàn vẹn của dữ liệu của bạn và để Kiểm tra các thay đổi thực sự.

Bạn cần tự hỏi liệu logic bạn muốn đưa vào trình kích hoạt có phù hợp nhất với (các) ứng dụng hoặc trong DB không, cân nhắc rủi ro ở cả hai phía (điều gì xảy ra nếu một ứng dụng mới xuất hiện và không thực thi điều này quy tắc?)

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.