2010-12-12 6 views
6

मेरे पास दो टेबल हैं। किसी अन्य तालिका में एक धारावाहिक क्षेत्र का संदर्भ देने वाली एक विदेशी कुंजी है। मैंने मालिक के अलावा किसी अन्य भूमिका के लिए INSERT विशेषाधिकार दिया है, लेकिन मैं अभी भी विदेशी कुंजी वाली तालिका में शामिल नहीं कर सकता हूं जब तक कि मैं तालिका के मालिक को संदर्भित फ़ील्ड वाले तालिका पर अद्यतन विशेषाधिकार प्रदान नहीं करता। मुझे समझ में नहीं आता कि मालिक को इस मामले में एक पंक्ति डालने में सक्षम होने के लिए एक और विशिष्ट भूमिका (INSERT विशेषाधिकार के साथ) के लिए अद्यतन अनुमति क्यों है।अनुमतियां: इस मामले में तालिका मालिक द्वारा अपडेट की आवश्यकता क्यों है?

यह थोड़ा उलझन में है, इसलिए मैंने अपने मुद्दे का उबला हुआ उदाहरण प्रदान किया है।

createuser -U postgres testowner -DIRS --pwprompt 
createdb -U postgres -O testowner testdb 
createuser -U postgres testupdater -DIRS --pwprompt 

psql -d testdb -U testowner 
CREATE TABLE a (id serial PRIMARY KEY); 
CREATE TABLE b (a_id integer REFERENCES a(id)); 
GRANT SELECT,INSERT ON ALL TABLES IN SCHEMA public TO testupdater; 
GRANT USAGE,UPDATE ON SEQUENCE a_id_seq TO testupdater; 
REVOKE INSERT, UPDATE ON ALL TABLES IN SCHEMA public FROM testowner; 
INSERT INTO a VALUES (DEFAULT); -- as expected: ERROR: permission denied for relation a 
\q 

psql -d testdb -U testupdater 
INSERT INTO a VALUES (DEFAULT); 
SELECT id FROM a LIMIT 1; -- selects the first id (1) 
INSERT INTO b VALUES (1); -- unexpected error: see below 
\q 

ERROR: permission denied for relation a

CONTEXT: SQL statement "SELECT 1 FROM ONLY "public"."a" x WHERE "id" OPERATOR(pg_catalog.=) $1 FOR SHARE OF x"

हालांकि, ऊपर डालने अगर मैं testowner वापस अद्यतन विशेषाधिकार (GRANT UPDATE ON a TO testowner;) देना काम करता है। इस मामले में परीक्षणकर्ता को अद्यतन की आवश्यकता क्यों है?

नोट: GRANT UPDATE ON a TO testupdater; मदद नहीं करता है; ऐसा लगता है कि मुझे टेस्टाउनर भूमिका में अद्यतन देना है।

+0

क्या यह काम करता है यदि आप उपयोगकर्ता को परीक्षक पर अनुमति पढ़ने देते हैं? यह सुनिश्चित करने के लिए कि सम्मिलन वैध है, testupdater पर एक डालने को परीक्षणकर्ता में विदेशी कुंजी के मानों को पढ़ने की आवश्यकता होगी। –

+0

@ मैसी मैंने कभी 'testowner' भूमिका की चयन अनुमति रद्द नहीं की। 'testupdater' को भी चयन अनुमति दी गई थी, ऐसा लगता है कि यह संदर्भ को जांचने के लिए तालिका' ए' पढ़ने में सक्षम होना चाहिए। –

+0

यह यहां पर ठीक काम करता है, कोई अप्रत्याशित त्रुटियां नहीं। –

उत्तर

6

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

उदा। अगर मैं एक तालिका बनाने और केवल अपने आप को यह करने के लिए चयन को पहुंच देने:

[email protected]=# create table t(t1_id serial primary key, value text); 
NOTICE: CREATE TABLE will create implicit sequence "t_t1_id_seq" for serial column "t.t1_id" 
NOTICE: CREATE TABLE/PRIMARY KEY will create implicit index "t_pkey" for table "t" 
CREATE TABLE 
[email protected]=# insert into t(value) values('foo'); 
INSERT 0 1 
[email protected]=# grant select on t to steve; 
GRANT 

अब हालांकि मैं मेज से पंक्तियों को पढ़ सकता है, मैं उन्हें लॉक नहीं कर सकते हैं:

[email protected]@[local] => select * from t; 
t1_id | value 
-------+------- 
    1 | foo 
(1 row) 

[email protected]@[local] => select * from t for share; 
ERROR: permission denied for relation t 

अब एक अनुमान बनाना। .. संभावित रूप से विदेशी पंक्तियों में लक्ष्य पंक्तियों की जांच करके विदेशी कुंजी का कार्यान्वयन कार्य करता है, और स्रोत तालिका या लक्ष्य तालिका के मालिक के आधार पर इसके लिए प्राधिकरण संदर्भ सेट करता है ... TBH मैंने तालिका को निरस्त नहीं किया है मालिक के विशेषाधिकार इसलिए मुझे इससे पहले सामना नहीं हुआ है।

मुझे लगता है कि यह इस बारे में आता है क्योंकि आप ऐसा खाता नहीं चाहते हैं जिसके पास सभी तालिकाओं तक पहुंच है क्योंकि उन्होंने उन्हें बनाया है? मेरा सुझाव है:

  • 'postgres' या कुछ अन्य सुपर उपयोगकर्ता pg_hba.conf
  • वैकल्पिक रूप में सीमित पहुंच है, के रूप में स्कीमा परिवर्तन प्रदर्शन करना, (उदाहरण के लिए डेटाबेस स्वामी) कुछ उपयोगकर्ता के रूप में स्कीमा परिवर्तन करने की जरूरत नहीं है कि set session authorization का उपयोग 'पोस्टग्रेस' या कुछ अन्य सुपरसुर
संबंधित मुद्दे