2011-06-09 14 views
20

मैं निम्नलिखित प्राप्त करने के लिए एक उचित समाधान खोजने में असमर्थ किया गया है को छोड़कर डेटाबेस के लिए सभी अधिकार प्रदान के एक ही स्कीमा), एक तालिका के लिए को छोड़कर, जिसमें उनके पास केवल चयन विशेषाधिकार होंगे।MySQL एक तालिका

अनिवार्य रूप से मैं चाहता हूं कि उपयोगकर्ता डेटाबेस पर नि: शुल्क शासन करे लेकिन एक विशिष्ट तालिका को अपडेट करने में सक्षम न हो।

अब तक मैं कोई फायदा नहीं हुआ है,: (। Db_name *)

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

  • उस डेटाबेस (db_name। *) पर सभी विशेषाधिकार प्रदान करते हुए फिर सम्मिलित करें, अपडेट करें और हटाएं। लेकिन इसने एक त्रुटि उत्पन्न की कि db_name.table_name के लिए कोई अनुदान नियम नहीं था।

जो मैं इकट्ठा करने में सक्षम हूं, उससे मुझे केवल तालिका को छोड़कर डेटाबेस की प्रत्येक तालिका पर सभी विशेषाधिकारों को व्यक्तिगत रूप से प्रदान करना होगा।

कृपया कोई मुझे बता एक आसान तरीका

है नोट: मैं MySQL 5.1 चल रहा हूँ। उबंटू 10.04 पर उपलब्ध नवीनतम।

+0

आपका MySQL संस्करण क्या है? – Devart

+0

क्षमा करें यह कहना चाहिए था, यह 5.1 – xzyfer

+0

है 1. दो डेटाबेस का उपयोग करने के बारे में क्या? मेरा मतलब है कि आप दूसरे डेटाबेस में विशेष तालिका स्टोर कर सकते हैं। 2. ... मैंने संस्करण के बारे में पूछा है, क्योंकि MySQL 5.5 में यह तैयार कथन के साथ किया जा सकता है। – Devart

उत्तर

6

AFAIK, हां, आपको प्रति तालिका अलग-अलग प्रदान करने की आवश्यकता है। लेकिन हे, आपके पास एक कंप्यूटर है। कंप्यूटर आप के लिए दोहरावदार कार्यों को स्वचालित में महान हैं, तो क्यों आप एक स्क्रिप्ट है कि करता है नहीं बनाते हैं निम्नलिखित:

  1. डेटाबेस (SHOW TABLES;)
  2. में सभी तालिकाओं की एक सूची प्राप्त पर प्रत्येक आइटम के लिए सूची, सभी अनुमतियों को विशेष तालिका

या, वैकल्पिक रूप से पर

  • निरस्त अनुमतियां मिल: 2. सूची में प्रत्येक आइटम के लिए, जाँच अगर यह विशेष तालिका है; यदि यह नहीं है, तो सभी अनुमतियां

    कारण मैं कोड नहीं दे रहा हूं यह है कि यह किसी भी स्क्रिप्टिंग भाषा में MySQL सुविधाओं, यहां तक ​​कि शैल स्क्रिप्ट के साथ भी किया जा सकता है; इसका उपयोग करें जो आप सबसे ज्यादा आरामदायक हैं।

  • +4

    हालांकि यह समाधान अभी काम करता है, यदि आप कभी भी डेटाबेस में टेबल जोड़ते हैं तो आपको प्रत्येक उपयोगकर्ता के लिए अनुमतियां जोड़नी होंगी नई टेबल * पर अनुमति जोड़ने के लिए एक तरीका प्रतीत नहीं होता है लेकिन किसी विशिष्ट तालिका पर एंटी-अनुमतियां होती हैं। –

    +0

    क्या इस तरह से ऐसा करने के लिए वास्तव में कोई रास्ता नहीं है? यह सही प्रतीत नहीं होता है। मैं mysql से बेहतर छोड़ दूंगा। मुझे यह भी करने की ज़रूरत है। – Para

    25

    मुझे पता है कि यह एक पुरानी पोस्ट है, लेकिन मैंने सोचा कि मैं दूसरों को देखने के लिए @tdammers प्रश्न में जोड़ दूंगा। आप अपने अनुदान आदेश बनाने के लिए info_schema.tables पर एक चयन CONCAT भी कर सकते हैं, और एक अलग स्क्रिप्ट लिखना नहीं है।

    पहले कि डाटाबेस से सभी विशेषाधिकारों को रद्द:

    REVOKE ALL PRIVILEGES ON db.* FROM [email protected]; 
    

    फिर अपने GRANT बयान बनाने के लिए:

    SELECT CONCAT("GRANT UPDATE ON db.", table_name, " TO [email protected];") 
    FROM information_schema.TABLES 
    WHERE table_schema = "YourDB" AND table_name <> "table_to_skip"; 
    

    कॉपी करके अपने MySQL ग्राहक में परिणाम पेस्ट और उन सब को चलाते हैं।

    +1

    'और table_name <>' उपयोग 'और table_name का उपयोग करने के बजाय' वाइल्डकार्ड 'अपवादों का उपयोग करने के लिए "% _something _%" ' –

    +0

    यह वास्तव में * आसान है। :) – Bowi

    1

    मारिया डीबी में भूमिका निभाने के लिए मैं जो उपयोग करता हूं उसका एक मसौदा है। शायद एक ईवेंट स्थापित करने से यह अधिक शांत हो जाएगा :-)

    DELIMITER $$ 
    
    DROP PROCEDURE IF EXISTS refreshRoles $$ 
    CREATE PROCEDURE refreshRoles() 
        COMMENT 'Grant SELECT on new databases/tables, revoke on deleted' 
    BEGIN 
        DECLARE done BOOL; 
        DECLARE db VARCHAR(128); 
        DECLARE tb VARCHAR(128); 
        DECLARE rl VARCHAR(128); 
        DECLARE tables CURSOR FOR 
        SELECT table_schema, table_name, '_bob_live_sg' FROM information_schema.tables 
        WHERE table_schema LIKE '%bob\_live\_sg' AND 
         ( false 
         OR table_name LIKE 'bundle%' 
         OR table_name LIKE 'cart%' 
         OR table_name LIKE 'catalog%' 
         OR table_name LIKE 'url%' 
        ); 
    
        DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=true; 
    
        CREATE ROLE IF NOT EXISTS '_bob_live_sg'; 
        REVOKE ALL, GRANT OPTION FROM '_bob_live_sg'; 
    
        OPEN tables; 
        SET done = false; 
        grant_loop: LOOP 
        FETCH tables INTO db, tb, rl; 
        IF done THEN 
         LEAVE grant_loop; 
        END IF; 
        SET @g = CONCAT('GRANT SELECT ON `', db, '`.`', tb, '` TO ', rl); 
        PREPARE g FROM @g; 
        EXECUTE g; 
        DEALLOCATE PREPARE g; 
        END LOOP; 
        CLOSE tables; 
    END $$ 
    
    DELIMITER ; 
    
    CALL refreshRoles; 
    
    संबंधित मुद्दे