2008-10-13 11 views
13

में उपयोगकर्ताओं को अतिरिक्त स्कीमा के लिए उपयोग देने के लिए मैं Oracle में दो उपयोगकर्ताओं बॉब और ऐलिस है, दोनों sqlplus से sysdba के रूप में निम्न कमांड चलाकर बनाया:सही रास्ता ओरेकल

 
    create user $blah identified by $password; 
    grant resource, connect, create view to $blah; 

मैं बॉब पूरा उपयोग किया है चाहता हूँ एलिस की स्कीमा (यानी, सभी टेबल) के लिए, लेकिन मुझे यकीन नहीं है कि कौन सी अनुदान चलाना है, और इसे sysdba या ऐलिस के रूप में चलाने के लिए है या नहीं।

संदर्भ सामग्री के लिए किसी भी अच्छे पॉइंटर्स के बारे में सुनकर खुशी हुई - ऐसा लगता है कि इंटरनेट या "ओरेकल डेटाबेस 10 जी पूर्ण संदर्भ" से इसका कोई अच्छा जवाब नहीं मिल रहा है, जो कि बैठा है मेरी मेज।

उत्तर

20

AFAIK आपको एक समय में अनुदान ऑब्जेक्ट करने की आवश्यकता है।

आमतौर पर आप की तर्ज पर इस, कुछ करने के लिए एक स्क्रिप्ट का उपयोग करेंगे:

SELECT 'GRANT ALL ON '||table_name||' TO BOB;' 
FROM ALL_TABLES 
WHERE OWNER = 'ALICE'; 

और अन्य डाटाबेस वस्तुओं के लिए इसी तरह की।

आप प्रत्येक स्कीमा में एक पैकेज डाल सकते हैं जिसे आपको अनुदान जारी करने की आवश्यकता है, जिससे प्रत्येक अनुदान के माध्यम से प्रत्येक अनुदान कथन को कॉल किया जाएगा।

उदा।

PROCEDURE GRANT_TABLES 
    IS 
    BEGIN 

     FOR tab IN (SELECT table_name 
        FROM all_tables 
        WHERE owner = this_user) LOOP 
     EXECUTE IMMEDIATE 'GRANT SELECT, INSERT, UPDATE, DELETE ON '||tab.table_name||' TO other_user'; 
     END LOOP; 
    END; 
7

विचार करने के लिए कई चीजें हैं। जब आप पहुंच कहते हैं, तो क्या आप अन्य उपयोगकर्ताओं के नाम के साथ तालिकाओं को उपसर्ग करना चाहते हैं? आप सार्वजनिक समानार्थी शब्द का उपयोग कर सकते हैं ताकि यदि आप कोई समस्या हो, तो आप मूल स्वामी को छुपा सकते हैं। और फिर समानार्थी पर निजी प्रदान करें।

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

6

एक अन्य समाधान यदि आप अलग अलग मालिक है:

BEGIN 

    FOR x IN (SELECT owner||'.'||table_name ownertab 
      FROM all_tables 
      WHERE owner IN ('A', 'B', 'C', 'D')) 
    LOOP 
    EXECUTE IMMEDIATE 'GRANT SELECT ON '||x.ownertab||' TO other_user'; 
    END LOOP; 
END;