त्रुटि: पोस्टग्रेज का उपयोग करते हुए अनुक्रम शहरों_आईडी_सेक के लिए अनुमति से इनकार किया गया


201

मैं पोस्टग्रैज पर नया हूं (और सभी डेटाबेस जानकारी सिस्टम पर)। मैं अपने डेटाबेस पर sql स्क्रिप्ट का अनुसरण कर रहा हूं:

create table cities (
id serial primary key,
name text not null
);

create table reports (
id serial primary key,
cityid integer not null references cities(id),
reportdate date not null,
reporttext text not null
);

create user www with password 'www';

grant select on cities to www;
grant insert on cities to www;
grant delete on cities to www;

grant select on reports to www;
grant insert on reports to www;
grant delete on reports to www;

grant select on cities_id_seq to www;
grant insert on cities_id_seq to www;
grant delete on cities_id_seq to www;

grant select on reports_id_seq to www;
grant insert on reports_id_seq to www;
grant delete on reports_id_seq to www;

जब उपयोगकर्ता www, के रूप में:

insert into cities (name) values ('London');

मुझे निम्नलिखित त्रुटि मिलती है:

ERROR: permission denied for sequence cities_id_seq

मुझे लगता है कि समस्या सीरियल प्रकार के साथ है। यही कारण है कि मैं www के लिए * _id_seq के लिए चयन, सम्मिलित करता है और हटाता हूं। फिर भी यह मेरी समस्या को ठीक नहीं करता है। मैं क्या खो रहा हूँ?


2
एक अनुक्रम पर सम्मिलित करना / हटाना मुझे समझ में नहीं आता है। मुझे आश्चर्य है कि यह भी काम करता है।
a_horse_with_no_name

जवाबों:


359

PostgreSQL 8.2 के बाद से आपको उपयोग करना होगा:

GRANT USAGE, SELECT ON SEQUENCE cities_id_seq TO www;

अनुदान का उपयोग - अनुक्रमों के लिए, यह विशेषाधिकार वक्र और अगले कार्यों का उपयोग करने की अनुमति देता है।

जैसा कि टिप्पणियों में @epic_fil द्वारा बताया गया है, आप स्कीमा में सभी अनुक्रमों को अनुमति दे सकते हैं:

GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO www;

52
FYI करें, वाक्यविन्यास "। SCHEMA स्कीमा_नाम में सभी अनुक्रमों पर भी" समर्थित है।
महाकाव्य_फिल

5
दिलचस्प। मैंने उस मेज पर सभी एक GRANT किया था जो मेरे अनुक्रम में है, लेकिन यह अनुक्रम को कवर नहीं करता है। यह भी OS से बहुत लगता है।
किन्नर होकेनहुल

41
यह एक वास्तविक चीज कैसे है? मैं कब किसी उपयोगकर्ता को तालिका में डेटा सम्मिलित करने की अनुमति देना चाहूंगा, लेकिन उन्हें इस तथ्य का उपयोग करने की अनुमति नहीं देना चाहता कि स्तंभों में से एक ऑटो-इंक्रीमेंटिंग है?
ब्रेट विडमियर

5
IS SELECTआवश्यक? नहीं करना चाहिए USAGEकवर क्या आवश्यक है?
T

6
@BrettWidmeier बिल्कुल। यह मेरे लिए मूर्खतापूर्ण है कि डेवलपर्स द्वारा इस तरह की चीज को कैसे सहन किया जाता है। यह उन लोगों की तरह है जो इंटरनेट पर घूमना चाहते हैं और उन चीजों को ठीक करने के प्रयास में अथक स्टैकऑवरफ्लो थ्रेड्स पढ़ना चाहते हैं, जिन्हें बॉक्स से बाहर काम करना चाहिए था।
मिल्स

67

चूँकि @Phil में बहुत सारी अपवाइट्स पर टिप्पणी हो रही है, जिस पर ध्यान नहीं दिया जा सकता है, मैं एक उत्तर जोड़ने के लिए अपने सिंटैक्स का उपयोग कर रहा हूं जो एक स्कीमा में सभी अनुक्रमों के लिए एक उपयोगकर्ता को अनुमति प्रदान करेगा (आपका स्कीमा डिफ़ॉल्ट है 'सार्वजनिक' )

GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public to www;

2
ध्यान दें कि यह केवल PostgreSQL 9.0 और ऊपर काम करता है, 8 में समान पूरा करने के लिए आप कुछ ऐसा कर सकते हैं: 'GRANT USAGE, SELECT ON' || quot_ident (योजनानाम) || '।' || quot_ident (relname) || 'TO www?' Pg_statio_all_fterences से जहां स्कीमनाम = 'सार्वजनिक'; - टॉम जेरकेन 2 दिन पहले
टॉम जेरकेन

39

@Tom_Gerken, @epic_fil और @kupson मौजूदा दृश्यों के साथ काम करने की अनुमति देने के लिए अपने बयानों के साथ काफी सही हैं। हालाँकि, उपयोगकर्ता को भविष्य में बनाए गए अनुक्रमों तक पहुँच अधिकार नहीं मिलेंगे। ऐसा करने के लिए, आपको GRANT स्टेटमेंट को ALTER DEFAULT PRIVILEGES स्टेटमेंट के साथ जोड़ना होगा, जैसे:

GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO www;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
    GRANT USAGE, SELECT ON SEQUENCES TO www;

यह केवल PostgreSQL 9+ पर काम करता है, बिल्कुल।

यह मौजूदा डिफ़ॉल्ट विशेषाधिकारों के लिए संलग्न होगा, उन्हें अधिलेखित नहीं करेगा, इसलिए उस संबंध में काफी सुरक्षित है।


-2

पोस्टग्रेज में निम्न कमांड निष्पादित करें।

पोस्टग्रेज में लॉगिन करें:

sudo su postgres;

psql dbname;

सृजन की आवश्यकताएं public.cities_id_seq INCREMENT 1
न्यूनतम 1
MAXVALUE 1
START 1 CACHE 1; TABLE सार्वजनिक public.ities_id_seq OWNER को pgowner;

pgowner आपका डेटाबेस उपयोगकर्ता होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.