2013-04-11 7 views
7

मैं अब कुछ दिनों से इस समस्या का हल ढूंढने की कोशिश कर रहा हूं और मैं बस कुछ काम करने के लिए प्रतीत नहीं कर सकता। समस्या निम्न है:उपयोगकर्ता और समूह अभिगम नियंत्रण के लिए MySQL डेटाबेस स्कीमा

मैं वर्तमान में एक आंकड़ा टूल विकसित कर रहा हूं जो कई अनुप्रयोगों के लिए कुछ ग्राफ और डेटा दिखाता है। इस डेटा तक पहुंच को स्पष्ट रूप से प्रतिबंधित करने की आवश्यकता है, क्योंकि उपयोगकर्ता ए के अनुप्रयोग "वन" और "दो" हैं और उन्हें "तीन" या "चार" नहीं दिखना चाहिए।

अब, प्रत्येक उपयोगकर्ता एकाधिक समूहों का सदस्य हो सकता है और इस समूह से अनुमतियां प्राप्त कर सकता है, लेकिन व्यक्तिगत अनुमति भी हो सकती है। इन अनुमतियों को प्रत्येक एप्लिकेशन के लिए सेट करना होगा।

  • उपयोगकर्ता खुद को इस आवेदन के डेटा के इस टुकड़े
  • समूहों उपयोगकर्ता के सदस्य है में से कोई एक की अनुमति है का उपयोग करने की अनुमति है: अगर एक आवेदन के डेटा का एक सेट तक पहुंच प्रदान किया जाता है इस आवेदन के डेटा के इस टुकड़े का उपयोग करने के

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

लक्ष्य एक मेज है कि वास्तविक अनुमतियां प्रत्येक उपयोगकर्ता वर्तमान में हर आवेदन के लिए है संग्रहीत करता है, समूह सदस्यता और मैं से गणना की है व्यक्तिगत अनुमतियां और वह जानकारी अन्य तालिकाओं के संबंधों के कारण हर समय सुसंगत रहती है।

अगर यह एक समाधान खोजने के लिए मदद करता है मैं नहीं जानता, लेकिन यहाँ एसक्यूएल आईडी 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 
); 

यह वही है मैं एक में संग्रहीत करना चाहते हैं है अतिरिक्त टेबल (केवल सभी उपयोगकर्ताओं के लिए)।

उत्तर

3

मुझे लगता है कि आपको एक दृश्य का उपयोग करना चाहिए। आपके पास पहले से ही क्वेरी है, दृश्य बनाने के लिए क्वेरी का उपयोग करें।

+0

संकेत के लिए धन्यवाद, मुझे यह भी नहीं पता था कि अभी तक एक दृश्य क्या था। मैं उस समय के लिए ऐसा करूँगा, हालांकि यह वास्तव में * मेरी समस्या का समाधान नहीं करता है, क्योंकि जब भी कोई व्यक्ति डेटा से अनुरोध करता है तो दृश्य प्रत्येक प्रासंगिक तालिका से सभी डेटा एकत्र करता है, जो ठीक है मैं बचाना चाहता हूं । मैं उस जानकारी को किसी तालिका में संग्रहीत करना चाहता हूं, और ** केवल ** इसे अपडेट करें यदि वास्तव में कुछ ऐसी चीजों में परिवर्तन होता है जो अनुमतियों को प्रभावित करते हैं (जैसे समूह हटाया जा रहा है)। – Anpan

+0

फिर आप ट्रिगर्स का उपयोग कर सकते हैं। [MYSQLtriggers] (http://dev.mysql.com/doc/refman/5.6/en/triggers.html)। जब एक तालिका अद्यतन होती है जो अनुमतियों को प्रभावित करती है। ट्रिगर को उस तालिका को अपडेट करें जहां सभी अनुमतियां संग्रहीत की जाती हैं। –

+0

आपको एक मटेरियलाइज्ड व्यू की ज़रूरत है, जो एक ऐसी सुविधा है जो MySQL में मौजूद नहीं है। लेकिन हाँ, आप एक नई तालिका को परिभाषित करके [http://www.fromdual.com/mysql-materialized-views) कर सकते हैं, और ट्रिगर्स का उपयोग करके यह सुनिश्चित कर सकते हैं कि यह सटीक रूप से पॉप्युलेट हो। –

संबंधित मुद्दे