मैं अब कुछ दिनों से इस समस्या का हल ढूंढने की कोशिश कर रहा हूं और मैं बस कुछ काम करने के लिए प्रतीत नहीं कर सकता। समस्या निम्न है:उपयोगकर्ता और समूह अभिगम नियंत्रण के लिए MySQL डेटाबेस स्कीमा
मैं वर्तमान में एक आंकड़ा टूल विकसित कर रहा हूं जो कई अनुप्रयोगों के लिए कुछ ग्राफ और डेटा दिखाता है। इस डेटा तक पहुंच को स्पष्ट रूप से प्रतिबंधित करने की आवश्यकता है, क्योंकि उपयोगकर्ता ए के अनुप्रयोग "वन" और "दो" हैं और उन्हें "तीन" या "चार" नहीं दिखना चाहिए।
अब, प्रत्येक उपयोगकर्ता एकाधिक समूहों का सदस्य हो सकता है और इस समूह से अनुमतियां प्राप्त कर सकता है, लेकिन व्यक्तिगत अनुमति भी हो सकती है। इन अनुमतियों को प्रत्येक एप्लिकेशन के लिए सेट करना होगा।
- उपयोगकर्ता खुद को इस आवेदन के डेटा के इस टुकड़े
- समूहों उपयोगकर्ता के सदस्य है में से कोई एक की अनुमति है का उपयोग करने की अनुमति है: अगर एक आवेदन के डेटा का एक सेट तक पहुंच प्रदान किया जाता है इस आवेदन के डेटा के इस टुकड़े का उपयोग करने के
लक्ष्य एक मेज है कि वास्तविक अनुमतियां प्रत्येक उपयोगकर्ता वर्तमान में हर आवेदन के लिए है संग्रहीत करता है, समूह सदस्यता और मैं से गणना की है व्यक्तिगत अनुमतियां और वह जानकारी अन्य तालिकाओं के संबंधों के कारण हर समय सुसंगत रहती है।
अगर यह एक समाधान खोजने के लिए मदद करता है मैं नहीं जानता, लेकिन यहाँ एसक्यूएल आईडी 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
);
यह वही है मैं एक में संग्रहीत करना चाहते हैं है अतिरिक्त टेबल (केवल सभी उपयोगकर्ताओं के लिए)।
संकेत के लिए धन्यवाद, मुझे यह भी नहीं पता था कि अभी तक एक दृश्य क्या था। मैं उस समय के लिए ऐसा करूँगा, हालांकि यह वास्तव में * मेरी समस्या का समाधान नहीं करता है, क्योंकि जब भी कोई व्यक्ति डेटा से अनुरोध करता है तो दृश्य प्रत्येक प्रासंगिक तालिका से सभी डेटा एकत्र करता है, जो ठीक है मैं बचाना चाहता हूं । मैं उस जानकारी को किसी तालिका में संग्रहीत करना चाहता हूं, और ** केवल ** इसे अपडेट करें यदि वास्तव में कुछ ऐसी चीजों में परिवर्तन होता है जो अनुमतियों को प्रभावित करते हैं (जैसे समूह हटाया जा रहा है)। – Anpan
फिर आप ट्रिगर्स का उपयोग कर सकते हैं। [MYSQLtriggers] (http://dev.mysql.com/doc/refman/5.6/en/triggers.html)। जब एक तालिका अद्यतन होती है जो अनुमतियों को प्रभावित करती है। ट्रिगर को उस तालिका को अपडेट करें जहां सभी अनुमतियां संग्रहीत की जाती हैं। –
आपको एक मटेरियलाइज्ड व्यू की ज़रूरत है, जो एक ऐसी सुविधा है जो MySQL में मौजूद नहीं है। लेकिन हाँ, आप एक नई तालिका को परिभाषित करके [http://www.fromdual.com/mysql-materialized-views) कर सकते हैं, और ट्रिगर्स का उपयोग करके यह सुनिश्चित कर सकते हैं कि यह सटीक रूप से पॉप्युलेट हो। –