Sự khác biệt giữa `ALTER TABLE TABLE TRIGGER` và` DISABLE TRIGGER` là gì?
Công ty của tôi ghi DDL trên một cơ sở dữ liệu bằng cách sử dụng Trình kích hoạt cơ sở dữ liệu, tìm kiếm DDL bao gồm:
ALTER_TABLECREATE_TRIGGERALTER_TRIGGERDROP_TRIGGER
Khi tôi tắt hoặc bật trình kích hoạt bằng cách sử dụng ALTER TABLE x DISABLE TRIGGER tiud_x, thay đổi này được ghi lại bằng Trình kích hoạt cơ sở dữ liệu.
Khi tôi tắt hoặc bật trình kích hoạt bằng cách sử dụng DISABLE TRIGGER tiud_x ON x, thay đổi này không được ghi lại.
Đối với tôi, DISABLE TRIGGERvà ENABLE TRIGGERgiống như "một thủ thuật kỳ lạ" để tránh kích hoạt trình kích hoạt cơ sở dữ liệu, vì chúng dường như tương đương về mặt chức năng. Sự khác biệt giữa ALTER TABLE DISABLE TRIGGERvà là DISABLE TRIGGERgì?
Trả lời
Thật đáng buồn:
Vô hiệu hóa bộ kích hoạt không làm thay đổi bộ kích hoạt, giống như tắt đèn không làm thay đổi bóng đèn. Tuy nhiên, thật buồn cười là nó không được nắm bắt
ALTER_TRIGGERnhưng một cái gì đó vẫn quản lý để cập nhậtmodify_datekhi nó xảy ra. ¯ \ - (ツ) - / ¯Trình kích hoạt DDL của bạn bắt được
ALTER TABLEbiến thể vì điều đó đang thay đổi rõ ràng bảng - nó nói như vậy trong lệnh. Mặc dù bạn có thể tranh luận rằng việc vô hiệu hóa trình kích hoạt sẽ thay đổi bảng bất kể cú pháp bạn sử dụng (và tôi sẽ đồng ý với bạn, đặc biệt là vì kết quả thực là giống nhau), sự khác biệt là đây hiện là một lỗ hổng trong những gì trình kích hoạt DDL nắm bắt , và không cóDISABLE_TRIGGERsự kiện nào (bạn có thể bỏ phiếu cho họ để sửa nó trong mục phản hồi này trên UserVoice , nhưng điều đó đã bị bỏ qua hoàn toàn trong hơn một thập kỷ). Đây là một câu hỏi có liên quan, chưa được trả lời về Stack Overflow .
Tương tự, một thời gian dài trước đây, tôi nhớ cácALTER_sự kiện đã không được nắm bắtRENAMEvà điều này đã được thêm vào như một sự kiện sau đó.
Bạn sẽ phải nắm bắt DISABLE TRIGGERtheo những cách khác, như kiểm tra hoặc Sự kiện mở rộng (tôi đã nói về điều này ở đây):
- Khi nào trình kích hoạt bảng bị tắt và được bật lại?
Trong trường hợp đó, bạn cũng có thể nắm bắt các ALTER TABLEbiến thể theo cùng một cách để cả hai đều được đăng nhập ở cùng một nơi.
Một ý tưởng thực sự ngớ ngẩn là thăm dò ý kiến sys.triggersmỗi n giây / phút / giờ và ghi nhật ký bất cứ khi nào trạng thái is_disabledthay đổi. Điều này sẽ không cho bạn biết ai đã làm điều đó nhưng ít nhất bạn sẽ biết rằng điều đó đã xảy ra và cùng với việc kiểm tra khác, bạn có thể thu hẹp nó.