2012-02-23 31 views
6

Trình kích hoạt được triển khai bên trong một cơ sở dữ liệu SQL như thế nào? Tôi không đề cập đến các định nghĩa kích hoạt cấp độ ngôn ngữ SQL mà là các triển khai cơ bản bên trong Oracle, SQL Server, MySQL, v.v. Làm thế nào để cơ sở dữ liệu có thể quản lý hàng trăm hoặc hàng nghìn trình kích hoạt? Họ có sử dụng mô hình đăng ký xuất bản như với một người quan sát/người nghe mẫu không? Bất kỳ con trỏ nào đến các tài liệu liên quan về chủ đề cũng sẽ được đánh giá cao.Trình kích hoạt cơ sở dữ liệu được triển khai bên trong một cơ sở dữ liệu SQL như thế nào?

Tôi đã google cho "triển khai kích hoạt cơ sở dữ liệu" nhưng tất cả những gì tôi tìm thấy là thông tin về định nghĩa kích hoạt SQL, một lần nữa không muốn tôi đang tìm kiếm.

+0

Tôi nghĩ rằng điều này có lẽ nên là [dba.se] ..; nhưng tôi sẽ theo dõi nó vì tôi thực sự không biết. – Ben

Trả lời

3

Trình kích hoạt là các cuộc gọi lại, do đó, việc triển khai có thể đơn giản như các con trỏ hàm trong C. Thông thường, người dùng không được mong đợi viết mã thủ tục do người dùng định nghĩa trong RDBMS trong C. Bạn sẽ cần hỗ trợ một số ngôn ngữ "cấp cao hơn" khác. Vì vậy, mẫu lập trình có liên quan là DSL. Số lượng các trigger (khả năng mở rộng) chính nó không phải là một vấn đề bởi vì thường chỉ có một, tối đa hai cho mỗi bảng và sự kiện DML chỉ kích hoạt chúng. Thách thức thực hiện là ở nơi khác: trong các lĩnh vực nhất quán, ngữ nghĩa đồng thời.

+0

Tôi đang cố gắng thực hiện một cơ chế kích hoạt giống như trong hệ thống của riêng tôi. Có, tôi biết rằng "người dùng không được mong đợi bằng văn bản [sic] mã thủ tục do người dùng định nghĩa trong RDBMS". Tôi không giới hạn bản thân mình với giả định của bạn rằng "thường chỉ có một, tối đa hai cho mỗi bảng". Tôi đang xem xét một trường hợp cao cấp, nơi có thể có hàng ngàn người kích hoạt. – stackoverflowuser2010

+1

Có vô số sự kiện kích hoạt giới hạn: chèn, cập nhật, xóa - Tôi không nghĩ ra bất kỳ điều gì khác. Trong một số kịch bản bóng lẻ một kích hoạt có thể gọi hàng ngàn thủ tục - nhưng ở đây tôi hoàn toàn đi đến vùng đất tưởng tượng không hiểu yêu cầu của bạn. –

1

Trước tiên, trình kích hoạt là các đoạn mã được chạy khi một sự kiện cụ thể (ví dụ: INSERT/UPDATE/DELETE trên một bảng cụ thể) xảy ra trong cơ sở dữ liệu. Trình kích hoạt được thực hiện ngầm định TRƯỚC KHI hoặc AFER câu lệnh và trình kích hoạt DML không thể được thực hiện một cách rõ ràng như các thủ tục được lưu trữ.

Ngoài ra còn có hai loại trình kích hoạt - bộ kích hoạt CẤP TUYỆT VỜI và bộ kích hoạt ROW LEVEL.

Trình kích hoạt mức hiển thị được kích hoạt TRƯỚC KHI hoặc SAU một câu lệnh được thực thi.

Trình kích hoạt ROW LEVEL được kích hoạt TRƯỚC KHI hoặc SAU một thao tác được thực hiện trên mỗi hàng riêng lẻ bị ảnh hưởng bởi thao tác.

Vì vậy, chúng tôi có 12 loại trigger:

1. BEFORE INSERT STATEMENT 
2. BEFORE INSERT ROW 
3. AFTER INSERT STATEMENT 
4. AFTER INSERT ROW 
5. BEFORE UPDATE STATEMENT 
6. BEFORE UPDATE ROW 
7. AFTER UPDATE STATEMENT 
8. AFTER UPDATE ROW 
9. BEFORE DELETE STATEMENT 
10. BEFORE DELETE ROW 
11. AFTER DELETE STATEMENT 
12. AFTER DELETE ROW 

Nhiều trigger có thể được mã hóa cho một sự kiện với trật tự của họ được ưu tiên thực hiện đề cập.

Bất cứ khi nào chúng tôi chạy truy vấn DML (INSERT/UPDATE/DELETE) trên cơ sở dữ liệu, truy vấn đó được chạy trong một giao dịch. Do đó khi một truy vấn chạy -

  1. Bảng này được khóa
  2. Các kiểm tra DBMS cho trigger chạy TRƯỚC tuyên bố là để được thực thi
  3. Thực hiện các câu lệnh SQL thực tế hàng-by-hàng.
  4. Kích hoạt TRƯỚC KHI cho MACHI ROW được tìm kiếm. Nếu tìm thấy, thực hiện.
  5. Kiểm tra lỗi. Nếu có, hãy khôi phục các thay đổi được thực hiện bởi câu lệnh hoặc trình kích hoạt của nó.
  6. Bất kỳ SAU KHI GỬI ROW được kích hoạt và thực thi.
  7. Bất kỳ SAU KHI trình kích hoạt STATEMENT được tìm thấy và thực thi.

DBMS khác nhau quản lý giao dịch khác nhau. Tham khảo tài liệu của họ để biết chi tiết.

Nhiều DBMS chỉ giữ nguyên trình kích hoạt ở định dạng văn bản, không giống như các thủ tục được lưu trữ được biên dịch. Thực hành tốt nhất là gọi các thủ tục được lưu trữ từ bên trong thân máy kích hoạt vì các thủ tục được lưu trữ có hiệu suất nhanh hơn nhiều so với các trình kích hoạt.

Các vấn đề liên quan