Ada cara untuk mengimplementasikan pewarisan peran dengan menggunakan relasi rekursif pada tabel Roles , dengan membuat referensi peran ke catatan lain:

Relasi ini akan menambahkan 1 : n warisan dalam Roles catatan. Anda mungkin mendapatkan seluruh hierarki pohon dengan fungsi tersimpan ini:
CREATE FUNCTION `getHierarchy`(`aRole` BIGINT UNSIGNED)
RETURNS VARCHAR(1024)
NOT DETERMINISTIC
READS SQL DATA
BEGIN
DECLARE `aResult` VARCHAR(1024) DEFAULT NULL;
DECLARE `aParent` BIGINT UNSIGNED;
SET `aParent` = (SELECT `parent` FROM `Roles` WHERE `id` = `aRole`);
WHILE NOT `aParent` IS NULL DO
SET `aResult` = CONCAT_WS(',', `aResult`, `aParent`);
SET `aParent` = (SELECT `parent` FROM `Roles` WHERE `id` = `aParent`);
END WHILE;
RETURN IFNULL(`aResult`, '');
END
Kemudian, Anda mungkin mendapatkan semua diberikan izin dengan sesuatu seperti ini:
SELECT
`permission_id`
FROM
`Permission_Role`
WHERE
FIND_IN_SET(`role_id`, `getHierarchy`({$role}))
AND
grant;
Jika tidak cukup, Anda dapat membuat tabel lain untuk pewarisan:

Namun, dalam hal ini, diperlukan algoritma perolehan hierarki yang lain.
Untuk mengatasi mengganti masalah Anda harus mendapatkan izin peran dan izin pengguna. Kemudian, tulis user izin atas roles izin untuk session .
Juga, saya sarankan untuk menghapus grant kolom di Permission_Role dan Permission_User . Tidak perlu memetakan setiap izin untuk mereka masing-masing. Cukup menggunakan EXISTS pertanyaan:jika ada catatan, maka izin diberikan, jika tidak - tidak. Jika Anda perlu mengambil semua izin dan status, Anda dapat menggunakan LEFT JOIN s.