2012-04-18 19 views
5

मैं रेल के लिए बहुत नया हूं, इसलिए उम्मीद है कि यह एक बेवकूफ सवाल नहीं है।मैं पोस्टग्रेस्क्ल के साथ रेल में टेबल स्वामित्व कैसे सेट करूं?

मैं दो अलग-अलग उपयोगकर्ता खातों के साथ एक पोस्टग्रेस्क्ल डेटाबेस का उपयोग करने की कोशिश कर रहा हूं। हालांकि मैं उन खातों के बीच स्विच करने में सक्षम होना चाहता हूं, इसलिए उनके पास डेटाबेस पर समान अनुमतियां हैं (उनमें से दोनों आदर्श रूप से पोस्टग्रेस्क्ल सुपरसियर नहीं हैं)।

मैंने पोस्टग्रेज़ में NOLOGIN भूमिका बनाई, जो डेटाबेस का मालिक है। फिर इस उपयोगकर्ता को दो उपयोगकर्ता खातों को सौंपा गया। बहरहाल, जब भी मैं rake db:migrate करते हैं, यह उपयोगकर्ता खाता (और नहीं भूमिका) तालिका के मालिक कर देगा। यदि मैं फिर उपयोगकर्ताओं को स्विच करता हूं, तो दूसरे उपयोगकर्ता को पहले उपयोगकर्ता द्वारा बनाई गई तालिकाओं पर सही अनुमति नहीं होगी।

दो खाता होने का कारण जल्दी से स्विच करने के लिए, उदाहरण के लिए सक्षम होने के लिए है जब मुझे बिना डाउनटाइम के पासवर्ड को बदलना होगा।

क्या टेबल बनाने के दौरान मालिक के रूप में विशिष्ट भूमिका का उपयोग करने के लिए रेल को बताने का कोई तरीका है? (या शायद वहाँ एक बेहतर तरीका एक ही PostgreSQL भूमिका में दो खातों के बिना यह पूरा करने के है?)

अद्यतन: अब तक मैं this solution पाया एक बाहरी स्क्रिप्ट के रूप में मैन्युअल रूप से चलाने के लिए और NOLOGIN भूमिका करने के लिए सभी तालिकाओं के स्वामित्व बदलने के लिए, लेकिन मैं कुछ और सुरुचिपूर्ण उम्मीद कर रहा हूं या रेल के साथ अच्छी तरह से फिट बैठता हूं।

उत्तर

5

आप PostgreSQL तरफ काफ़ी कर सकते हैं: सभी विशेषाधिकार है कि role1 धारण करने के लिए

आप role2 चाहते हैं, तो आप सिर्फ कर सकते हैं:

GRANT role1 TO role2; 

और/या, PostgreSQL 9.0 के साथ या बाद में, आप नए वस्तुओं पर default privileges स्थापित करने के लिए PostgreSQL निर्देश दे सकते हैं:

ALTER DEFAULT PRIVILEGES allows you to set the privileges that will be applied to objects created in the future. (It does not affect privileges assigned to already-existing objects.) Currently, only the privileges for tables (including views and foreign tables), sequences, and functions can be altered.

आप ऐसा कर सकते हैं भूमिकाओं या स्कीमा के लिए। अपने मामले तुम सकता है के लिए:

ALTER DEFAULT PRIVILEGES FOR ROLE role1 GRANT SELECT ON TABLES TO role2; 

आप विशेषाधिकार का एक सेट साझा करने के लिए अधिक अलग-अलग भूमिकाओं चाहते हैं, मैं वस्तुओं पर सभी अनुमतियों को एक गैर लॉगिन भूमिका के लिए प्रदान करेगा (GROUP कहा जाता था) - role0 नीचे मेरे उदाहरण में। इसके लिए DEFAULT PRIVILEGES का उपयोग करें और अनुक्रम सहित पूर्व-मौजूदा वस्तुओं के बारे में न भूलें (मुझे उनको भूलना है)।
फिर GRANT role0 उन अन्य भूमिकाओं के लिए।

इन पंक्तियों के साथ:

ALTER DEFAULT PRIVILEGES FOR ROLE role1 GRANT SELECT ON TABLES TO role0; 
ALTER DEFAULT PRIVILEGES FOR ROLE role2 GRANT SELECT ON TABLES TO role0; 
... 

GRANT role0 TO role1; 
GRANT role0 TO role2; 

इस तरह से आप आसानी से GRANT अतिरिक्त विशेषाधिकार केवल अगर जरूरत हो सकता है एक भूमिका चाहिए। आप इस सेटअप में जितनी चाहें उतनी भूमिकाएं जोड़ सकते हैं।

कई डीएमएल स्टेटमेंटऑब्जेक्ट के की आवश्यकता है।मैं the manual on ALTER TABLE बोली:

You must own the table to use ALTER TABLE.

भूमिका है कि तालिका काम भी मालिक के सदस्य होने के नाते। तो, उपरोक्त उदाहरण में, यदि आप role0 अपनी टेबल बनाते हैं, role1 और role2ALTER TABLE का उपयोग कर सकते हैं। निष्पादित करें:

ALTER TABLE tbl OWNER TO user0; 

आपके द्वारा बनाए गए हर तालिका के लिए।

या आप भूमिका में पर्ची इससे पहले कि आप CREATE कमांड चलाने:

SET ROLE user0; 
CREATE ...; 
CREATE ...; 
RESET ROLE; 

आप ट्रैक खो दिया है कि आप कौन हैं, तो:

SELECT current_user, session_user; 
+0

त्वरित उत्तर के लिए धन्यवाद। तो पहले विकल्प को देखते हुए: दो उपयोगकर्ताओं के साथ एक 'मास्टर' भूमिका रखने के बजाय, मेरे पास दो उपयोगकर्ता होंगे जो प्रत्येक को दूसरे पर दिए गए हैं? जैसे उपयोगकर्ता उपयोगकर्ता को उपयोगकर्ता 1 को अनुदान दें; उपयोगकर्ता उपयोगकर्ता को उपयोगकर्ता 1 को अनुदान दें? और इसे 'स्विच' से पहले हर बार मैन्युअल रूप से निष्पादित करना होगा? अगर मैं 'डिफॉल्ट प्राइवेट्स' का उपयोग करता हूं, हालांकि मैं इसे सिर्फ एक बार कर सकता हूं। सही? – gingerlime

+0

['GRANT'] (http://www.postgresql.org/docs/current/interactive/sql-grant.html) का मतलब विशेषाधिकारों को स्थायी रूप से प्रदान करना है और केवल एक बार इसकी आवश्यकता है। –

+0

दास होने के लिए खेद है, लेकिन मुझे समझ में नहीं आता कि यह कैसे काम करेगा। ऐसा लगता है कि अनुदान पदानुक्रमित हैं, उदा। 'उपयोगकर्ता उपयोगकर्ता को उपयोगकर्ता 2' दें, इसलिए उपयोगकर्ता 2 में उपयोगकर्ता 1 के समान अनुमतियां होंगी, लेकिन दूसरी तरफ नहीं। मुझे दोनों उपयोगकर्ताओं को एक ही विशेषाधिकार प्राप्त करने की आवश्यकता है, भले ही उपयोगकर्ता ने एक टेबल बनाया हो। शायद मुझे कुछ याद आ रही है। – gingerlime

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

  • कोई संबंधित समस्या नहीं^_^