तालिका पर पुनरावर्ती संबंध का उपयोग करके भूमिका विरासत को लागू करने का एक तरीका है Roles
, किसी अन्य रिकॉर्ड के लिए भूमिका संदर्भ बनाकर:
यह संबंध जोड़ देगा 1 : n
Roles
. के भीतर विरासत अभिलेख। आप इस संग्रहीत फ़ंक्शन के साथ संपूर्ण पदानुक्रम ट्री प्राप्त कर सकते हैं:
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
फिर, आप सभी दी गई . प्राप्त कर सकते हैं कुछ इस तरह की अनुमतियाँ:
SELECT
`permission_id`
FROM
`Permission_Role`
WHERE
FIND_IN_SET(`role_id`, `getHierarchy`({$role}))
AND
grant;
यदि यह पर्याप्त नहीं है, तो आप विरासत के लिए एक और तालिका बना सकते हैं:
लेकिन, इस मामले में, एक और पदानुक्रम प्राप्ति एल्गोरिथम की आवश्यकता है।
ओवरराइडिंग . का समाधान करने के लिए समस्या आपको भूमिका अनुमतियाँ और उपयोगकर्ता अनुमतियाँ प्राप्त करनी होंगी। फिर, user
write लिखें Roles
. पर अनुमतियां session
. के लिए अनुमतियां ।
साथ ही, मैं grant
को हटाने का सुझाव देता हूं Permission_Role
. में कॉलम और Permission_User
. मानचित्र की कोई आवश्यकता नहीं है उनमें से प्रत्येक के लिए हर अनुमति। बस EXISTS
का उपयोग करने के लिए पर्याप्त है प्रश्न:यदि कोई रिकॉर्ड है, तो अनुमति दी गई है, अन्यथा - ऐसा नहीं है। यदि आपको सभी अनुमतियों और स्थितियों को पुनः प्राप्त करने की आवश्यकता है, तो आप LEFT JOIN
. का उपयोग कर सकते हैं एस.