PostgreSQL में एक साथ सभी तालिकाओं पर OWNER संशोधित करें


409

मैं PostgreSQL डेटाबेस में सभी तालिकाओं के स्वामी को कैसे संशोधित करूं?

मैंने कोशिश की, ALTER TABLE * OWNER TO new_ownerलेकिन यह तारांकन सिंटैक्स का समर्थन नहीं करता है।

जवाबों:


459

REASSIGN OWNEDआदेश देखें

नोट: जैसा कि @trygvis नीचे दिए गए जवाब में उल्लेख करता है , REASSIGN OWNEDकमांड कम से कम 8.2 संस्करण के बाद से उपलब्ध है, और एक बहुत आसान तरीका है।


चूंकि आप सभी तालिकाओं के लिए स्वामित्व बदल रहे हैं, आप संभावित रूप से दृश्य और क्रम भी चाहते हैं। यहाँ मैंने क्या किया है:

टेबल्स:

for tbl in `psql -qAt -c "select tablename from pg_tables where schemaname = 'public';" YOUR_DB` ; do  psql -c "alter table \"$tbl\" owner to NEW_OWNER" YOUR_DB ; done

दृश्यों:

for tbl in `psql -qAt -c "select sequence_name from information_schema.sequences where sequence_schema = 'public';" YOUR_DB` ; do  psql -c "alter sequence \"$tbl\" owner to NEW_OWNER" YOUR_DB ; done

दृश्य:

for tbl in `psql -qAt -c "select table_name from information_schema.views where table_schema = 'public';" YOUR_DB` ; do  psql -c "alter view \"$tbl\" owner to NEW_OWNER" YOUR_DB ; done

आप शायद डीआरवाई कर सकते हैं क्योंकि परिवर्तन के बयान तीनों के लिए समान हैं।



10
+1 धन्यवाद एलेक्स। मैंने आपके उत्तर के आधार पर थोड़ा सा बैश स्क्रिप्ट बनाया है, जो gist.github.com/2482969
gingerlime

10
@Trygvis द्वारा हालिया उत्तर देखें। अब तक का सबसे सरल उत्तर:REASSIGN OWNED BY old_role [, ...] TO new_role
डेविड

64
डाक द्वारा स्वामित्व वाली वस्तुओं के लिए काम नहीं किया गया है।
ब्रूनो जेसीएम

19
इसके अलावा, REASSIGN OWNED वास्तव में पुरानी भूमिका के स्वामित्व वाले सभी डेटाबेसों के स्वामित्व को प्रभावित करता है (देखें: postgresql.org/docs/9.3/static/sql-reassign- प्रसिद्ध . html )। इसलिए यदि आप केवल एकल डेटाबेस का स्वामित्व बदलना चाहते हैं, तो सावधान!
kitsune

3
@Gingerlime स्क्रिप्ट के आधार पर, bspkrs (उसका नाम नहीं मिल सकता है) ने एक ऐसा बनाया है जो फ़ंक्शन को भी बदलता है: https://gist.github.com/bspkrs/b997ed7f1eb1268f3403
elysations

537

आप REASSIGN OWNEDकमांड का उपयोग कर सकते हैं ।

सारांश:

REASSIGN OWNED BY old_role [, ...] TO new_role

यह old_roleनई भूमिका के स्वामित्व वाली सभी वस्तुओं को बदल देता है । आपको यह सोचने की ज़रूरत नहीं है कि उपयोगकर्ता के पास किस तरह की वस्तुएं हैं, वे सभी बदल दी जाएंगी। ध्यान दें कि यह केवल एकल डेटाबेस के अंदर की वस्तुओं पर लागू होता है। यह स्वयं डेटाबेस के स्वामी को परिवर्तित नहीं करता है।

यह कम से कम 8.2 पर उपलब्ध है। उनका ऑनलाइन डॉक्यूमेंटेशन केवल इतना ही आगे बढ़ता है।


ERROR: unexpected classid 3079। मुझे लगता है कि अगर कोई एक्सटेंशन नहीं है तो वर्तमान में काम नहीं करता है।
स्टीव जॉर्गेंसन

40
यह उपयोगकर्ता के पोस्टग्रेज के लिए काम नहीं करता है, भले ही मैं एक डेटाबेस से जुड़ा हूं जो मैंने बनाया (यानी एक सिस्टम डेटाबेस नहीं), यह कहता है: त्रुटि: भूमिका पोस्ट के स्वामित्व वाली वस्तुओं के स्वामित्व को फिर से असाइन नहीं कर सकता क्योंकि उन्हें डेटाबेस द्वारा आवश्यक है प्रणाली
thnee

13
जैसा कि @thnee ने बताया, REASSIGN डेटाबेस में सभी ऑब्जेक्ट्स को प्रभावित करता है और यह उपयोगकर्ता परिभाषित और सिस्टम ऑब्जेक्ट्स के बीच कोई भेदभाव नहीं करता है, इसलिए यह पोस्टग्रेज के लिए काम नहीं करता है यदि कोई भी एक्सटेंशन अपनी टेबल है। फिर भी मैं लालित्य के लिए इस विकल्प को (+1) पसंद करता हूं, भले ही इससे मुझे बहुत मदद नहीं मिली (मेरा डेटाबेस पहले पोस्टग्रेज के स्वामित्व में था)।
पावेल वी।

6
बस स्पष्ट होने के लिए, यह कमांड डेटाबेस में काम करता है जिसे आप वर्तमान में केवल कनेक्टेड हैं। यदि पुराना_रोले कई डेटाबेस में ऑब्जेक्ट का मालिक है, तो आपको उन सभी डेटाबेसों में से प्रत्येक में इस कमांड को कनेक्ट करना चाहिए और चलाना चाहिए
mavroprovato

11
यह AWS RDS के माध्यम से होस्ट किए गए पोस्टग्रेज पर काम नहीं करता है। मुझे यह त्रुटि "ऑब्जेक्ट्स को पुन: असाइन करने की अनुमति" से मिल रही है और इस लिंक से पता चलता है कि: "ऐसा प्रतीत होता है कि 'स्वामित्व का पुनर्मूल्यांकन' का एकमात्र तरीका एक सुपरयुसर (जो प्रलेखन द्वारा विरोधाभास है) के रूप में है, जो सुलभ नहीं है आरडीएस में। ' postgresql-archive.org/…
typoerrpr

196

यह: http://archives.postgresql.org/pgsql-bugs/2007-10/msg00234.php भी एक अच्छा और तेज़ समाधान है, और एक डेटाबेस में कई स्कीमाओं के लिए काम करता है:

टेबल्स

SELECT 'ALTER TABLE '|| schemaname || '.' || tablename ||' OWNER TO my_new_owner;'
FROM pg_tables WHERE NOT schemaname IN ('pg_catalog', 'information_schema')
ORDER BY schemaname, tablename;

दृश्यों

SELECT 'ALTER SEQUENCE '|| sequence_schema || '.' || sequence_name ||' OWNER TO my_new_owner;'
FROM information_schema.sequences WHERE NOT sequence_schema IN ('pg_catalog', 'information_schema')
ORDER BY sequence_schema, sequence_name;

दृश्य

SELECT 'ALTER VIEW '|| table_schema || '.' || table_name ||' OWNER TO my_new_owner;'
FROM information_schema.views WHERE NOT table_schema IN ('pg_catalog', 'information_schema')
ORDER BY table_schema, table_name;

भौतिकवादी दृश्य

इस उत्तर के आधार पर

SELECT 'ALTER TABLE '|| oid::regclass::text ||' OWNER TO my_new_owner;'
FROM pg_class WHERE relkind = 'm'
ORDER BY oid;

यह सभी आवश्यक ALTER TABLE/ ALTER SEQUENCE/ उत्पन्न करता हैALTER VIEW स्टेटमेंट , इन्हें कॉपी करें और इन्हें चलाने के लिए इन्हें वापस plsql में पेस्ट करें।

Psql में अपना काम करके देखें:

\dt *.*
\ds *.*
\dv *.*

महान समाधान। मेरा एकमात्र मुद्दा यह था कि मैंने स्क्रिप्ट का निर्यात किया था और फिर निर्यात की गई स्क्रिप्ट को निष्पादित किया। मैं SQL सर्वर गुरु हूं, लेकिन मुझे यकीन नहीं है कि शॉर्टकट को निष्पादित करने के लिए क्या है। मैंने निष्पादित क्वेरी पर क्लिक किया और pgScript को निष्पादित किया। मैं क्या गलत कर रहा था?
टायरोन मूडले

1
मैंने इसे पसंद किया क्योंकि यह plsql के भीतर काम करता है एक बार लॉग इन करने के बाद - यूनिक्स स्तर की स्क्रिप्ट (वर्तमान में पसंदीदा उत्तर) को मेरे पर्यावरण में "-यू पोस्टग्रेज" और पासवर्ड प्रविष्टि की आवश्यकता होती है।
घबड़ाया हुआ

2
मैं इस उत्तर को पसंद करता हूं क्योंकि (1) यह psql या pgAdmin में किया जा सकता है (2) यह आसानी से आपको उन वस्तुओं को देखने की अनुमति देता है जिन्हें आप बदल रहे हैं। मैंने stackoverflow.com/questions/22803096/… का भी उपयोग किया , जो समान है, लेकिन कार्यों के लिए।
AlannaRose


42

यदि आप इसे एक sql स्टेटमेंट में करना चाहते हैं, तो आपको http://wiki.postgresql.org/wiki/Dynamic_DDL में उल्लिखित निष्पादन () फ़ंक्शन को परिभाषित करना होगा

CREATE FUNCTION exec(text) returns text language plpgsql volatile
  AS $f$
    BEGIN
      EXECUTE $1;
      RETURN $1;
    END;
$f$;

तब आप इस क्वेरी को निष्पादित कर सकते हैं, यह तालिकाओं, दृश्यों और विचारों के स्वामी को बदल देगा:

SELECT exec('ALTER TABLE ' || quote_ident(s.nspname) || '.' ||
            quote_ident(s.relname) || ' OWNER TO $NEWUSER')
  FROM (SELECT nspname, relname
          FROM pg_class c JOIN pg_namespace n ON (c.relnamespace = n.oid) 
         WHERE nspname NOT LIKE E'pg\\_%' AND 
               nspname <> 'information_schema' AND 
               relkind IN ('r','S','v') ORDER BY relkind = 'S') s;

$ NEWUSER नए मालिक का नया नाम है।

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

इसके साथ मदद करने के लिए #postgresql पर रोडियमटॉड का धन्यवाद ।


2
यह बहुत अधिक उपयोगी है क्योंकि यह फ़ंक्शंस, इंडेक्स, अनुक्रम, आदि सहित पूरे स्कीमा के स्वामित्व को बदलता है .. धन्यवाद!
liviucmg

यह स्कीमा मालिकों को नहीं बदलता है। स्कीमा मालिकों को भी कैसे बदला जाए?
एंड्रस जूल

@Andrus ALTER DATABASE $ DB OWNER को $ OWNER;
जोहान डाहलिन

परिवर्तन डेटाबेस पूरे डेटाबेस के मालिक को बदलता है। मैंने पूछा कि स्कीमा मालिकों को कैसे बदलना है।
एंड्रस

अन्य स्कीमा ने दांव लगाने के लिए ऑर्नर को निकाल दिया;
एरिक एल्डिंगर

21

मुझे हाल ही में एक डेटाबेस में सभी वस्तुओं के स्वामित्व को बदलना पड़ा। हालाँकि तालिकाओं, विचारों, ट्रिगर्स और अनुक्रमों को कुछ आसानी से बदल दिया गया था क्योंकि फ़ंक्शन के लिए उपरोक्त दृष्टिकोण विफल हो गया क्योंकि हस्ताक्षर फ़ंक्शन नाम का हिस्सा है। दी, मेरी एक MySQL पृष्ठभूमि है और पोस्टग्रेज से परिचित नहीं हूं।

हालाँकि, pg_dump आपको केवल स्कीमा डंप करने की अनुमति देता है और इसमें ALY xxx OWNER TO yyy; आपके लिए आवश्यक कथन यहाँ विषय पर मेरा थोड़ा सा जादू है

pg_dump -s YOUR_DB | grep -i 'owner to' | sed -e 's/OWNER TO .*;/OWNER TO NEW_OWNER;/i' | psqL YOUR_DB

मुझे यकीन नहीं है कि आप grepकमांड का उपयोग क्यों कर रहे हैं । मैं खुद लिनक्स के लिए नया हूं, लेकिन मेरी समझ से, ऐसा लगता है कि यह sedउपयोग करने के लिए ठीक है, खासकर जब से आप किसी भी मामले में असंवेदनशील निर्दिष्ट कर रहे हैं।
बोबार्ट

19

बहुत आसान है, यह कोशिश करो ...

 select 'ALTER TABLE ' || table_name || ' OWNER TO myuser;' from information_schema.tables where table_schema = 'public';

4
आप एक नोट जोड़ सकते हैं कि संबंधित तार को कॉपी और निष्पादित किया जाना है। ऐसा नहीं है कि यह स्पष्ट नहीं है: पी
नाइटस्केप

जिसमें परिवर्तन कथन के आसपास के सभी उद्धरणों को हटाना शामिल है .. बहु-श्रापकर्ता या प्रतिस्थापित इस मामले में मदद करता है।
ज्ञातव्य

19

बहुत सरल है

  1. su - पोस्टग्रेज
  2. psql
  3. REASSIGN OWNED BY [old_user] को [new_user];
  4. \ c [आपका डेटाबेस]
  5. REASSIGN OWNED BY [old_user] को [new_user];

किया हुआ।


1
यह शायद वही करता है जो चौकन्ना चाहता था। अब तक सबसे आसान।
जिओफ़ सवेया

1
आप पार्टी में केवल 4 साल की देरी से हैं; स्क्रॉल करें: stackoverflow.com/a/13535184/1772379
बेन जॉनसन

16

मैं इस एक के बाद से यह संशोधित करता है की तरह टेबल , विचारों , दृश्यों और कार्यों को एक निश्चित के मालिक स्कीमा में एक ही बार (एक एसक्यूएल बयान में), एक समारोह बनाने के बिना और आप इसे सीधे उपयोग कर सकते हैं pgAdmin तृतीय और psql :

(PostgreSql v9.2 में परीक्षण किया गया)

DO $$DECLARE r record;
DECLARE
    v_schema varchar := 'public';
    v_new_owner varchar := '<NEW_OWNER>';
BEGIN
    FOR r IN 
        select 'ALTER TABLE "' || table_schema || '"."' || table_name || '" OWNER TO ' || v_new_owner || ';' as a from information_schema.tables where table_schema = v_schema
        union all
        select 'ALTER TABLE "' || sequence_schema || '"."' || sequence_name || '" OWNER TO ' || v_new_owner || ';' as a from information_schema.sequences where sequence_schema = v_schema
        union all
        select 'ALTER TABLE "' || table_schema || '"."' || table_name || '" OWNER TO ' || v_new_owner || ';' as a from information_schema.views where table_schema = v_schema
        union all
        select 'ALTER FUNCTION "'||nsp.nspname||'"."'||p.proname||'"('||pg_get_function_identity_arguments(p.oid)||') OWNER TO ' || v_new_owner || ';' as a from pg_proc p join pg_namespace nsp ON p.pronamespace = nsp.oid where nsp.nspname = v_schema
    LOOP
        EXECUTE r.a;
    END LOOP;
END$$;

@Rkj, @AlannaRose, @SharoonThomas, @ उपयोगकर्ता 565605 और द्वारा प्रदान किए गए उत्तरों के आधार पर इस उत्तर पर @a_horse_with_no_name द्वारा

बहुत बहुत धन्यवाद।


बेहतर अभी तक: इसके अलावा डेटाबेस और स्कीमा मालिक बदलें ।

DO $$DECLARE r record;
DECLARE
    v_schema varchar := 'public';
    v_new_owner varchar := 'admin_ctes';
BEGIN
    FOR r IN 
        select 'ALTER TABLE "' || table_schema || '"."' || table_name || '" OWNER TO ' || v_new_owner || ';' as a from information_schema.tables where table_schema = v_schema
        union all
        select 'ALTER TABLE "' || sequence_schema || '"."' || sequence_name || '" OWNER TO ' || v_new_owner || ';' as a from information_schema.sequences where sequence_schema = v_schema
        union all
        select 'ALTER TABLE "' || table_schema || '"."' || table_name || '" OWNER TO ' || v_new_owner || ';' as a from information_schema.views where table_schema = v_schema
        union all
        select 'ALTER FUNCTION "'||nsp.nspname||'"."'||p.proname||'"('||pg_get_function_identity_arguments(p.oid)||') OWNER TO ' || v_new_owner || ';' as a from pg_proc p join pg_namespace nsp ON p.pronamespace = nsp.oid where nsp.nspname = v_schema
        union all
        select 'ALTER SCHEMA "' || v_schema || '" OWNER TO ' || v_new_owner 
        union all
        select 'ALTER DATABASE "' || current_database() || '" OWNER TO ' || v_new_owner 
    LOOP
        EXECUTE r.a;
    END LOOP;
END$$;

गजब का! क्यों पोस्टगर्ल्स इसे जोड़ते नहीं हैं मुझे नहीं पता!
पिप

दो प्रश्न: 1) ऐसा लगता है कि पहली और तीसरी "ALTER TABLE" रेखाएं हैं। क्या यह जानबूझकर (जैसे आपको स्वामित्व बदलने के लिए तालिकाओं पर दो पास करने हैं?)। 2) हम देख रहे हैं कि अनुक्रमों को सूचीबद्ध करते हुए information_schema.sequencesभी खाली है SELECT c.* FROM pg_class c WHERE c.relkind = 'S';। वे मेल क्यों नहीं कर सकते हैं?
ग्यूपैडपॉक

इसके अलावा, क्या दूसरी ALTERक्वेरी नहीं होनी चाहिए ALTER SEQUENCE?
ग्यूपैडपॉक

12

मुझे तालिकाओं, विचारों और अनुक्रमों के स्वामित्व को बदलना पड़ा और पाया कि @rjk द्वारा पोस्ट किया गया महान समाधान ठीक काम कर रहा है - एक विस्तार के बावजूद: यदि वस्तु नाम मिश्रित मामले के हैं (उदाहरण के लिए "TableName"), तो यह " त्रुटि नहीं मिली।
इसे दरकिनार करने के लिए, इस तरह ऑब्जेक्ट नामों को "" के साथ लपेटें:

टेबल्स

SELECT 'ALTER TABLE \"'|| schemaname || '.' || tablename ||'\" OWNER TO my_new_owner;'
FROM pg_tables WHERE NOT schemaname IN ('pg_catalog', 'information_schema')
ORDER BY schemaname, tablename;

दृश्यों

SELECT 'ALTER SEQUENCE \"'|| sequence_schema || '.' || sequence_name ||'\" OWNER TO my_new_owner;'
FROM information_schema.sequences WHERE NOT sequence_schema IN ('pg_catalog', 'information_schema')
ORDER BY sequence_schema, sequence_name;

दृश्य

SELECT 'ALTER VIEW \"'|| table_schema || '.' || table_name ||'\" OWNER TO my_new_owner;'
FROM information_schema.views WHERE NOT table_schema IN ('pg_catalog', 'information_schema')
ORDER BY table_schema, table_name;

10

आप निम्नलिखित PostgreSQL 9 में कोशिश कर सकते हैं

DO $$DECLARE r record;
BEGIN
    FOR r IN SELECT tablename FROM pg_tables WHERE schemaname = 'public'
    LOOP
        EXECUTE 'alter table '|| r.tablename ||' owner to newowner;';
    END LOOP;
END$$;

6

PostgreSQL में ऐसी कोई कमांड नहीं है। लेकिन आप GRANTs के लिए कुछ समय पहले वर्णित विधि का उपयोग करके इसके चारों ओर काम कर सकते हैं ।


धन्यवाद, बहुत अच्छा लेख। मैं इसे भविष्य के संदर्भ के रूप में रखूंगा। PgAdmin का उपयोग करते हुए, मैंने DB को बैकअप देना, DB को छोड़ना / हटाना, अस्थायी रूप से new_owner को आवश्यक अधिकार प्रदान करना, और फिर DB को new_owner के रूप में फिर से बनाना और पुनर्स्थापित करना "पुनर्स्थापना विंडो में" कोई मालिक नहीं "विकल्प के साथ जाँच की। इसने उन परिणामों का उत्पादन किया जिन्हें मैं new_owner के साथ सब कुछ के मालिक के रूप में देख रहा था।
काई

पोस्टग्रास 9.3 ने REASSIGN OWNED कमांड की शुरुआत की। postgresql.org/docs/9.3/sql-reassign- प्रसिद्ध.html
जोर्ज जिमर

3

Elysch द्वारा उत्तर के आधार पर , यहां कई स्कीमाओं के लिए एक समाधान है:

DO $$
DECLARE 
  r record;
  i int;
  v_schema text[] := '{public,schema1,schema2,schema3}';
  v_new_owner varchar := 'my_new_owner';
BEGIN
    FOR r IN 
        select 'ALTER TABLE "' || table_schema || '"."' || table_name || '" OWNER TO ' || v_new_owner || ';' as a from information_schema.tables where table_schema = ANY (v_schema)
        union all
        select 'ALTER TABLE "' || sequence_schema || '"."' || sequence_name || '" OWNER TO ' || v_new_owner || ';' as a from information_schema.sequences where sequence_schema = ANY (v_schema)
        union all
        select 'ALTER TABLE "' || table_schema || '"."' || table_name || '" OWNER TO ' || v_new_owner || ';' as a from information_schema.views where table_schema = ANY (v_schema)
        union all
        select 'ALTER FUNCTION "'||nsp.nspname||'"."'||p.proname||'"('||pg_get_function_identity_arguments(p.oid)||') OWNER TO ' || v_new_owner || ';' as a from pg_proc p join pg_namespace nsp ON p.pronamespace = nsp.oid where nsp.nspname = ANY (v_schema)
        union all
        select 'ALTER DATABASE "' || current_database() || '" OWNER TO ' || v_new_owner 
    LOOP
        EXECUTE r.a;
    END LOOP;
    FOR i IN array_lower(v_schema,1) .. array_upper(v_schema,1)
    LOOP
        EXECUTE 'ALTER SCHEMA "' || v_schema[i] || '" OWNER TO ' || v_new_owner ;
    END LOOP;
END
$$;

2

@ एलेक्स सोतो द्वारा दिया गया उत्तर सही है और @ योव एनर द्वारा अपलोड किया गया जेंट भी काम करता है बशर्ते कि तालिका में कोई विशेष वर्ण / नाम न हों (जो पोस्टगर्ल में कानूनी हैं)।

आपको उन्हें काम करने के लिए भागने की जरूरत है और मैंने उसके लिए एक जिस्ट अपलोड किया है: https://gist.github.com/2911117


2
pg_dump as insert statements 
pg_dump -d -O database filename
-d ( data as inserts ) -O ( capital O is no owner )

फिर बैकअप फ़ाइल को पोस्टग्रेएसक्यूएल में वापस उपयोग करके पाइप करें:

psql -d database -U username -h hostname < filename

जैसा कि कोई भी स्वामी शामिल नहीं है, तब आपके द्वारा निर्दिष्ट लॉगिन उपयोगकर्ता के तहत बनाई गई तालिका, स्कीमा, आदि के सभी बनाये जाते हैं।

मैंने पढ़ा है कि यह PostgreSQL संस्करणों के बीच भी माइग्रेट करने के लिए एक अच्छा तरीका हो सकता है।


2

मैंने उसके लिए एक सुविधाजनक स्क्रिप्ट बनाई है; pg_change_db_owner.sh । यह स्क्रिप्ट डेटाबेस स्कीमा में सभी तालिकाओं, विचारों, अनुक्रमों और कार्यों के लिए स्वामित्व बदलती है और स्कीमा के मालिक भी।

कृपया ध्यान दें कि यदि आप किसी विशेष डेटाबेस में, विशेष डेटाबेस भूमिका के स्वामित्व में, सभी वस्तुओं के स्वामित्व को बदलना चाहते हैं, तो आप बस REASSIGN OWNEDइसके बजाय कमांड का उपयोग कर सकते हैं ।


1

PostgreSQL 9.0 में शुरू, आपके पास वह क्षमता है GRANT [priv name] ON ALL [object type] IN SCHEMAजहां [priv name]विशिष्ट है SELECT, INSERT, UPDATE, DELETE, etcऔर [object type]इनमें से एक हो सकती है:

  • TABLES
  • SEQUENCES
  • FUNCTIONS

PostgreSQL के डॉक्स पर GRANTऔर REVOKEइस बारे में अधिक विस्तार से जाना। कुछ स्थितियों में सिस्टम कैटलॉग ( pg_catalog.pg_*) को शामिल करने के लिए अभी भी ट्रिक्स का उपयोग करना आवश्यक है, लेकिन यह लगभग आम नहीं है। मैं अक्सर निम्नलिखित कार्य करता हूं:

  1. BEGIN निजी को संशोधित करने के लिए एक लेनदेन
  2. DATABASES"DBA भूमिका" के स्वामित्व को बदलें
  3. SCHEMAS"DBA भूमिका" के स्वामित्व को बदलें
  4. REVOKE ALLसभी पर निजी TABLES, SEQUENCESऔर FUNCTIONSसभी भूमिकाओं से
  5. GRANT SELECT, INSERT, UPDATE, DELETE उपयुक्त भूमिकाओं के लिए प्रासंगिक / उपयुक्त तालिकाओं पर
  6. COMMIT डीसीएल लेनदेन।

1

स्वीकृत समाधान फ़ंक्शन स्वामित्व का ध्यान नहीं रखता निम्नलिखित समाधान सब कुछ का ख्याल रखता है (समीक्षा करते समय मैंने देखा कि यह @magicons के समान है)

echo "Database: ${DB_NAME}"
echo "Schema: ${SCHEMA}"
echo "User: ${NEW_OWNER}"

pg_dump -s -c -U postgres ${DB_NAME} | egrep "${SCHEMA}\..*OWNER TO"| sed -e "s/OWNER TO.*;$/OWNER TO ${NEW_OWNER};/" | psql -U postgres -d ${DB_NAME}
# do following as last step to allow recovery
psql -U postgres -d postgres -c "ALTER DATABASE ${DB_NAME} OWNER TO ${NEW_OWNER};"

1

निम्नलिखित सरल शेल स्क्रिप्ट ने मेरे लिए काम किया।

#!/bin/bash
for i in  `psql -U $1  -qt -c  "select tablename from pg_tables where schemaname='$2'"`
do
psql -U $1 -c  "alter table $2.$i set schema $3"
done

जहां इनपुट $ 1 - उपयोगकर्ता नाम (डेटाबेस) $ 2 = मौजूदा स्कीमा $ 3 = नए स्कीमा के लिए।


1

कार्यों के लिए @ एलेक्ससोटो के दृष्टिकोण के समान:

IFS=$'\n'  
for fnc in `psql -qAt -c "SELECT  '\"' || p.proname||'\"' || '(' || pg_catalog.pg_get_function_identity_arguments(p.oid) || ')' FROM pg_catalog.pg_namespace n JOIN pg_catalog.pg_proc p ON p.pronamespace = n.oid WHERE n.nspname = 'public';" YOUR_DB` ; do  psql -c "alter function $fnc owner to NEW_OWNER" YOUR_DB; done

0

Docker: सभी तालिकाओं + अनुक्रमों के स्वामी को संशोधित करें

export user="your_new_owner"
export dbname="your_db_name"

cat <<EOF | docker run -i --rm --link postgres:postgres postgres sh -c "psql -h \$POSTGRES_PORT_5432_TCP_ADDR -p \$POSTGRES_PORT_5432_TCP_PORT -U postgres -d $dbname" | grep ALTER | docker run -i --rm --link postgres:postgres postgres sh -c "psql -h \$POSTGRES_PORT_5432_TCP_ADDR -p \$POSTGRES_PORT_5432_TCP_PORT -U postgres -d $dbname"
SELECT 'ALTER TABLE '||schemaname||'.'||tablename||' OWNER TO $user;' FROM pg_tables WHERE schemaname = 'public';
SELECT 'ALTER SEQUENCE '||relname||' OWNER TO $user;' FROM pg_class WHERE relkind = 'S';
EOF
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.