2013-07-26 47 views
6

Về cơ bản, tôi muốn có thể sử dụng lệnh REVOKE để tắt UPDATEDELETE, nhưng tôi vẫn muốn trình kích hoạt trên bảng để cập nhật các hàng của mình.Có cách nào để tắt cập nhật/xóa nhưng vẫn cho phép trình kích hoạt thực hiện chúng không?

Trình kích hoạt của tôi hoạt động trên các hàng mới được chèn và cập nhật một trường cụ thể. Vì vậy, tôi vẫn muốn hành vi này, nhưng họ sẽ không bị vô hiệu hóa với REVOKE hoặc với RULE. (I saw an SO post)

Có cách nào để tiếp tục sử dụng các lệnh UPDATE/INSERT trong TRIGGERS nhưng tắt phần còn lại không?

+0

Nếu trình kích hoạt của bạn cập nhật các hàng đang được chèn - đó là dấu hiệu của thiết kế kém. Bạn có thể hiển thị như một số của bạn gây nên hoặc nói, bạn làm gì với họ? –

+0

Nếu bạn cần 'cập nhật một trường cụ thể' của bản ghi được chèn - bạn có thể chỉ định giá trị mong muốn cho' NEW.specific_field'. Bạn không cần cập nhật riêng. –

+0

Tôi không thiết kế nó, nhưng tôi không biết liệu tôi có thể làm gì tốt hơn để thành thật hay không. Tôi chưa xem xét các trình kích hoạt. Có lẽ tôi có thể sử dụng điều này, tôi không biết. Tôi sẽ cho bạn biết. Cảm ơn – Paco

Trả lời

11

Có, điều này là có thể.

Kích hoạt được chạy với các đặc quyền của chức năng kích hoạt, mặc định là SECURITY INVOKER có nghĩa là, chức năng kích hoạt được thực thi hiệu quả với các đặc quyền của current_user, trong trường hợp của bạn là một hàng chèn.

Nếu người dùng hiện tại không có các đặc quyền bắt buộc đối với các bảng mà hàm kích hoạt của bạn hoạt động, hoạt động ban đầu của bạn trong bảng bên dưới sẽ bị lỗi.

Tuy nhiên, bạn có thể sử dụng SECURITY DEFINER cho chức năng kích hoạt để có chức năng này chạy với những đặc quyền của OWNER của hàm.

Nếu bạn có một superuser riêng chức năng kích hoạt, nó có thể làm tất cả mọi thứ - đó sẽ là một mối nguy hiểm an ninh tốt. Xem xét các hướng dẫn trong sách hướng dẫn về Writing SECURITY DEFINER Functions Safely.

Nhưng sẽ khôn ngoan hơn khi tạo một vai trò đơn giản chỉ với các đặc quyền cần thiết OWNER của hàm kích hoạt. Bạn thậm chí có thể chỉ cần tạo một "daemon" vai trò mà không cần đăng nhập, đóng vai trò như là đặc quyền bó cho các hoạt động như vậy. Sau đó, bạn sẽ chỉ cấp các đặc quyền cần thiết (trên lược đồ, bảng, trình tự ...) cho vai trò daemon này. Đối với các thiết kế phức tạp hơn, bạn nên gộp các đặc quyền trong "các vai trò nhóm" (một lần nữa, không đăng nhập) và cấp các vai trò nhóm này cho các vai trò cần (vai trò daemon trong ví dụ này), có hiệu quả làm cho chúng trở thành "thành viên của nhóm". Tôi làm điều đó rất nhiều.

Cũng xem xét this related question on dba.SE liên quan đến các đặc quyền trên chính hàm đó.

+0

Cảm ơn, có vẻ thực sự tốt. Lời giải thích bạn đã cung cấp thật tuyệt vời. Tôi sẽ cần phải kiểm tra xem khi nào tôi sẽ có cơ hội. Cảm ơn một lần nữa :) – Paco