Próbuję znaleźć rozwiązanie tego problemu przez kilka dni i po prostu nie mogę wymyślić czegoś, co działa. Problem jest następujący:Schemat bazy danych MySQL do kontroli dostępu użytkownika i grupy
Obecnie rozwijam narzędzie statystyczne, które pokazuje niektóre wykresy i dane dla kilku aplikacji. Dostęp do tych danych oczywiście musi być ograniczony, ponieważ użytkownik A posiada aplikacje "jeden" i "dwa" i nie może zobaczyć "trzy" lub "cztery".
Teraz każdy użytkownik może być członkiem wielu grup i dziedziczyć uprawnienia z tej grupy, ale może również mieć indywidualne uprawnienia. Te uprawnienia muszą być ustawione dla każdej aplikacji. Dostęp do zbioru danych z jednej aplikacji jest udzielane, jeżeli:
- Użytkownik sam ma dostępu do tej części danych tej aplikacji
- Każda z grup, których użytkownik jest członkiem ma pozwolenie aby uzyskać dostęp do tej części danych tej aplikacji
celem jest mieć tabeli, który przechowuje aktualne uprawnienia każdy użytkownik ma obecnie do każdego zastosowania, liczonego od członkostwa grupa i ja indywidualne uprawnienia i zawsze są one spójne ze względu na relacje z innymi tabelami.
Nie wiem, czy to pomaga znaleźć rozwiązanie, ale tutaj jest SQL, aby uzyskać aktualnie aktywne uprawnienia użytkownika o identyfikatorze 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
);
To jest to, co chcę, aby przechowywać w sposób dodatkowa stolik (tylko dla wszystkich użytkowników).
Dzięki za podpowiedź, nawet nie wiedziałem, jaki widok był do tej pory. Zrobię to na razie, ale to nie * tak naprawdę * rozwiązuje mój problem, ponieważ widok zbiera również wszystkie dane z każdej odpowiedniej tabeli za każdym razem, gdy ktoś żąda od niej danych, czego właśnie chcę uniknąć . Chcę przechowywać te informacje w tabeli, a ** tylko ** aktualizować je, jeśli faktycznie są zmiany w coś, co wpływa na uprawnienia (takie jak usuwana grupa). – Anpan
Następnie możesz użyć wyzwalaczy. [MYSQLtriggers] (http://dev.mysql.com/doc/refman/5.6/en/triggers.html). Gdy tabela jest aktualizowana, co wpływa na uprawnienia. Ustaw wyzwalacz, aby zaktualizować tabelę, w której przechowywane są wszystkie uprawnienia. –
Potrzebny jest widok zmaterializowany, który jest funkcją, która nie istnieje w MySQL. Ale tak, możesz [symulować jeden] (http://www.fromdual.com/mysql-materialized-views), definiując nową tabelę i używając wyzwalaczy, aby upewnić się, że jest dokładnie wypełniony. –