2009-08-27 48 views
5

Tôi có trình kích hoạt để kiểm tra một cột trong bảng, khi có cập nhật (SAU KHI CẬP NHẬT) trong cột đó, trình kích hoạt của tôi được gọi và sau đó tôi gọi thủ tục được lưu trữ từ bên trong trình kích hoạt của mình để thực hiện một số logic nghiệp vụ được mã hóa bằng Java.Làm thế nào để bạn kiểm tra các bản cập nhật trên nhiều bảng trong Oracle?

Cho đến nay, rất tốt. Bây giờ mọi thứ trở nên phức tạp hơn, có một yêu cầu mới ngụ ý rằng cùng một logic (logic được thực thi bởi trigger) cũng nên được thực hiện nếu có thay đổi trong các cột nằm trong 4 bảng khác. Tôi nghĩ rằng không thực tế khi có cùng một trình kích hoạt trong 5 bảng khác nhau lắng nghe các cột khác nhau và tôi không chắc liệu tôi có nên xem xét việc tạo "chế độ xem" cho các cột này hay không và kích hoạt một lần trong chế độ xem đó (chi phí là bao nhiêu để trả về hiệu suất và/hoặc tài nguyên?)

Trong kinh nghiệm trước đây của bạn với Oracle, phương pháp hay giải pháp của bạn cho kịch bản này là gì?

Trả lời

2
  1. Bạn có thể thực sự tạo chế độ xem tham gia tất cả các bảng được đề cập không? Họ có chìa khóa nước ngoài với nhau không?
  2. Giả sử bạn có thể tạo chế độ xem, tất cả các bảng có thể cập nhật được bằng cách sử dụng chế độ xem phức tạp không? Có những hạn chế nghiêm trọng về điều này.
  3. Nói chung, chúng tôi chỉ tạo các trình kích hoạt INSTEAD OF trên một chế độ xem. Ngoài ra còn có những hạn chế về kích hoạt dựa trên các hoạt động UPDATE. Đối với một danh sách đầy đủ về các vấn đề liên quan đến tham khảo

http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_7004.htm#SQLRF01405

Lưu ý: Tôi giả sử ORACLE là db như bạn đã gắn thẻ câu hỏi của bạn với ORACLE

+0

Có, tôi đang sử dụng Oracle. Tôi có thể tham gia tất cả các cột này trong một chế độ xem, nhưng tôi vẫn không chắc chắn liệu tôi có thể cập nhật chế độ xem phức tạp này hay không, vì vậy tôi nghĩ rằng cách tiếp cận INSTEAD OF sẽ hoạt động đối với tôi. Tôi sẽ thử phương pháp đó và sau đó tôi sẽ cho bạn biết chuyện gì đã xảy ra. –

+0

Cảm ơn bkm, chúng tôi vừa mới triển khai phương pháp này (INSTEAD OF), nhưng chúng tôi phải đối mặt với một số giới hạn kỹ thuật và những ràng buộc mà chúng tôi không thể vượt qua. –

5

Cách duy nhất bạn có thể sử dụng một kích hoạt cho nhiều bảng để tạo chế độ xem.

Nếu tôi không muốn tạo chế độ xem, tôi sẽ tạo tập lệnh (hoặc bất kỳ thứ gì, sử dụng ngôn ngữ bạn muốn) và danh sách các bảng được kích hoạt (tạo việc kích hoạt động) .. Tôi thấy quan điểm của bạn là có khả năng duy trì tốt nhất về tình huống này và tôi nghĩ việc tạo ra một khung nhìn là giải pháp sạch hơn (và dễ duy trì) hơn là tạo ra năng động của một kích hoạt cho mỗi bảng.

+0

Cuối cùng, chúng tôi đã quyết định sử dụng cách tiếp cận bằng cách sử dụng chế độ xem cho các mục đích nhất định nhưng chúng tôi phải giữ một vài trình kích hoạt trong thiết kế cho một số mục đích cụ thể. Câu trả lời của bạn là điều tương tự nhất với những gì chúng tôi quyết định làm, nhưng những đề xuất khác thật tuyệt vời và cũng được xem xét. Cảm ơn Svetlozar! –

2

Tại sao không có logic của bạn trong một lưu trữ thủ tục, sau đó chỉ cần gọi đó từ các kích hoạt?

Tôi cũng khuyên bạn nên xem change notification, từ âm thanh đó, đó có thể là thứ bạn muốn nhiều hơn chỉ là một trình kích hoạt cũ đơn giản.

Cũng nên cẩn thận khi gọi các tài nguyên bên ngoài. Bất cứ điều gì bạn gọi trong trình kích hoạt sẽ được giao dịch, vì Oracle có thể chạy trình kích hoạt nhiều lần trước khi DML của bạn thực sự được hoàn thành.

+0

Cảm ơn đặc biệt cho lời nhắc về các hoạt động giao dịch trong các trình kích hoạt, điều đó đã giúp tôi chỉ ra một vấn đề với giải pháp ứng cử viên. Cảm ơn bạn lần nữa! –

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