2013-04-11 49 views
7

Tôi đã cố gắng tìm một giải pháp cho vấn đề này trong một vài ngày và tôi dường như không thể nghĩ ra một thứ gì đó có hiệu quả. Vấn đề là như sau:Lược đồ cơ sở dữ liệu MySQL cho người dùng và nhóm kiểm soát truy cập

Tôi hiện đang phát triển một công cụ thống kê hiển thị một số biểu đồ và dữ liệu cho một số ứng dụng. Quyền truy cập vào dữ liệu này rõ ràng cần phải bị hạn chế, vì Người dùng A sở hữu các ứng dụng "Một" và "Hai" và không được xem "Ba" hoặc "Bốn".

Giờ đây, mỗi người dùng có thể là thành viên của nhiều nhóm và kế thừa quyền từ nhóm này, nhưng cũng có thể có các quyền riêng lẻ. Các quyền này phải được đặt cho từng ứng dụng. Truy cập vào một tập hợp các dữ liệu của một ứng dụng được cấp nếu:

  • Người dùng mình có quyền truy cập phần này của dữ liệu của ứng dụng này
  • Bất kỳ một trong những nhóm người dùng là thành viên của có sự cho phép để truy cập vào phần dữ liệu này của ứng dụng này

http://i.stack.imgur.com/y4W6E.png

mục đích là để có một bảng mà các cửa hàng các điều khoản thực tế mỗi người dùng hiện có cho mọi ứng dụng, tính từ thành viên nhóm và tôi quyền cá nhân và có thông tin đó nhất quán ở mọi thời điểm do các mối quan hệ với các bảng khác.

Tôi không biết nếu điều này giúp tìm một giải pháp, nhưng đây là SQL để có được các điều khoản đang hoạt động của người sử dụng với id 1:

(
SELECT u.perm_id AS perm, u.user_id AS uid, u.app_id AS app 
FROM daUsers_has_daPermissions AS u 
WHERE u.user_id = 1 
) 
UNION 
(
SELECT g.perm_id AS perm, u.user_id AS uid, g.app_id AS app 
FROM daUsers_has_daPermissions AS u, daUsergroup_has_daPermissions AS g, daUsergroup_has_daUsers AS g_has_u 
WHERE u.user_id = 1 
AND u.user_id = g_has_u.user_id 
AND g.group_id = g_has_u.group_id 
); 

Đây là những gì tôi muốn để lưu trữ trong một bảng phụ (chỉ dành cho tất cả người dùng).

Trả lời

3

Âm thanh với tôi, bạn nên sử dụng chế độ xem. Bạn đã có truy vấn, sử dụng truy vấn để tạo chế độ xem.

+0

Cảm ơn gợi ý, tôi thậm chí không biết chế độ xem là gì cho đến lúc này. Tôi sẽ làm điều đó trong thời gian này, tuy nhiên nó không * thực sự giải quyết được vấn đề của tôi, vì khung nhìn cũng thu thập tất cả dữ liệu từ mọi bảng có liên quan mỗi lần ai đó yêu cầu dữ liệu từ đó, đó chính xác là những gì tôi muốn tránh . Tôi muốn lưu trữ thông tin đó trong một bảng, và ** chỉ ** cập nhật nó nếu có thực sự thay đổi một cái gì đó ảnh hưởng đến quyền (như một nhóm bị xóa). – Anpan

+0

Sau đó, bạn có thể sử dụng trình kích hoạt. [MYSQLtriggers] (http://dev.mysql.com/doc/refman/5.6/en/triggers.html). Khi bảng được cập nhật ảnh hưởng đến quyền. Làm cho trình kích hoạt cập nhật bảng nơi tất cả các quyền được lưu trữ. –

+0

Điều bạn cần là Chế độ xem vật hoá, là một tính năng không tồn tại trong MySQL. Nhưng có bạn có thể [mô phỏng một] (http://www.fromdual.com/mysql-materialized-views) bằng cách xác định một bảng mới và sử dụng trình kích hoạt để đảm bảo nó được điền chính xác. –

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