मेरे पास दो टेबल हैं। किसी अन्य तालिका में एक धारावाहिक क्षेत्र का संदर्भ देने वाली एक विदेशी कुंजी है। मैंने मालिक के अलावा किसी अन्य भूमिका के लिए 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;
मदद नहीं करता है; ऐसा लगता है कि मुझे टेस्टाउनर भूमिका में अद्यतन देना है।
क्या यह काम करता है यदि आप उपयोगकर्ता को परीक्षक पर अनुमति पढ़ने देते हैं? यह सुनिश्चित करने के लिए कि सम्मिलन वैध है, testupdater पर एक डालने को परीक्षणकर्ता में विदेशी कुंजी के मानों को पढ़ने की आवश्यकता होगी। –
@ मैसी मैंने कभी 'testowner' भूमिका की चयन अनुमति रद्द नहीं की। 'testupdater' को भी चयन अनुमति दी गई थी, ऐसा लगता है कि यह संदर्भ को जांचने के लिए तालिका' ए' पढ़ने में सक्षम होना चाहिए। –
यह यहां पर ठीक काम करता है, कोई अप्रत्याशित त्रुटियां नहीं। –