PostgreSQL এ একসাথে সমস্ত টেবিলগুলিতে OWNER পরিবর্তন করুন


409

পোস্টগ্রিএসকিউএল ডাটাবেসে সমস্ত টেবিলের মালিককে আমি কীভাবে সংশোধন করব?

আমি চেষ্টা করেছি ALTER TABLE * OWNER TO new_ownerকিন্তু এটি অ্যাসিটার্ক সিনট্যাক্স সমর্থন করে না।

উত্তর:


459

REASSIGN OWNEDকমান্ড দেখুন

দ্রষ্টব্য: @ ট্রাটিভিভিস যেমন নীচের উত্তরে উল্লেখ করেছে , REASSIGN OWNEDকম্যান্ডটি কমপক্ষে ৮.২ সংস্করণ থেকে পাওয়া যায় এবং এটি একটি সহজ পদ্ধতি।


যেহেতু আপনি সমস্ত টেবিলের জন্য মালিকানা পরিবর্তন করছেন, আপনি সম্ভবত দেখতে এবং সিকোয়েন্সগুলিও চান। আমি যা করেছি তা এখানে:

টেবিল:

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
জিঞ্জারাইম

10
@Rygvis দ্বারা সাম্প্রতিক উত্তর দেখুন। এখন পর্যন্ত সহজ উত্তর:REASSIGN OWNED BY old_role [, ...] TO new_role
ডেভিড

64
মালিকানাধীন স্বীকৃত পোস্টগ্রাগের মালিকানাধীন সামগ্রীর জন্য কাজ করে না।
ব্রুনোজেসিএম

19
এছাড়াও, পুনরায় স্বীকৃত পুরানো ভূমিকাটির মালিকানাধীন সমস্ত ডেটাবেজের মালিকানাকে প্রভাবিত করে (দেখুন: postgresql.org/docs/9.3/static/sql-reassign-owned.html )। সুতরাং আপনি যদি কেবল একটি একক ডাটাবেসের মালিকানা পরিবর্তন করতে চান তবে সাবধান!
কিটসুন

3
@ ভার্জারলাইম স্ক্রিপ্টের উপর ভিত্তি করে, বিএসপিআরসিএস (তার নাম খুঁজে পেল না) এমন একটি তৈরি করেছে যা ফাংশনগুলিকেও পরিবর্তন করে: https://gist.github.com/bspkrs/b997ed7f1eb1268f3403
ইলিশ

537

আপনি REASSIGN OWNEDকমান্ডটি ব্যবহার করতে পারেন ।

সারমর্ম:

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

এটি old_roleনতুন ভূমিকার মালিকানাধীন সমস্ত অবজেক্টগুলিকে পরিবর্তন করে । ব্যবহারকারীকে কী ধরণের অবজেক্টস রয়েছে তা নিয়ে আপনাকে ভাবতে হবে না, সেগুলি সবই বদলে যাবে। নোট করুন যে এটি কেবলমাত্র একটি একক ডাটাবেসের অভ্যন্তরে থাকা সামগ্রীর জন্য প্রযোজ্য। এটি নিজেই ডাটাবেসের মালিককে পরিবর্তন করে না।

এটি কমপক্ষে 8.2 এ ফিরে পাওয়া যায়। তাদের অনলাইন ডকুমেন্টেশন কেবল এটি অনেক পিছনে যায়।


ERROR: unexpected classid 3079। আমার ধারণা যে কোনও এক্সটেনশন থাকলে বর্তমানে কাজ করে না।
স্টিভ জর্জেনসেন

40
এটি ব্যবহারকারীর পোস্টগ্রাসের জন্য কাজ করে না বলে মনে হচ্ছে, যদিও আমি তৈরি হওয়া একটি ডাটাবেসের সাথে সংযুক্ত হয়েছি (যেমন সিস্টেম ডেটাবেস নয়) এটি এতে বলে: ত্রুটি: ভূমিকা পোস্টগ্রাগের মালিকানাধীন অবজেক্টগুলির মালিকানা পুনরায় বরাদ্দ করতে পারে না কারণ এগুলি ডেটাবেস দ্বারা প্রয়োজনীয় সিস্টেম
ত্রিশ

13
@ তৃতীয় প্রতিবেদন অনুসারে, REASSIGN ডাটাবেসের সমস্ত বস্তুকে প্রভাবিত করে এবং এটি ব্যবহারকারীর সংজ্ঞায়িত এবং সিস্টেম অবজেক্টগুলির মধ্যে কোনও পার্থক্য রাখে না, সুতরাং পোষাগ্রসের জন্য যদি কোনও নিজস্ব টেবিল রয়েছে এমন কোনও এক্সটেনশন থাকে তবে এটি কাজ করে না। তবুও আমি (+1) কমনীয়তার জন্য এই বিকল্পটি পছন্দ করি, যদিও এটি আমাকে বেশি সহায়তা করে না (আমার ডাটাবেসটি আগে পোস্টগ্রিজের মালিকানাধীন ছিল)।
পাভেল ভি।

6
কেবল স্পষ্ট করে বলতে গেলে, এই কমান্ডটি ডাটাবেজে কাজ করে যে আপনি বর্তমানে কেবলমাত্র সংযুক্ত। যদি ওল্ড_রোল একাধিক ডাটাবেসে অবজেক্টগুলির মালিক হয় তবে আপনার এই কমান্ডটি সংযুক্ত করে সেই ডাটাবেসের প্রত্যেকটিতে চালানো উচিত
mavroprovato

11
এটি AWS আরডিএসের মাধ্যমে হোস্ট করা পোস্টগ্রাগে কাজ করছে বলে মনে হচ্ছে না। আমি এই ত্রুটিটি পেয়েছি "অবজেক্টগুলিকে পুনরায় নিয়োগের অনুমতি অস্বীকার করা হয়েছে" এবং এই লিঙ্কটি কেন পরামর্শ দেয়: "মনে হবে যে 'মালিকানা পুনর্নির্ধারণের একমাত্র উপায় হ'ল সুপারভাইজার (যা ডকুমেন্টেশন দ্বারা বিপরীত), যা অ্যাক্সেসযোগ্য নয় আরডিএসে। ' 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বিবৃতি জেনারেট করে , এগুলি অনুলিপি করুন এবং এগুলি চালানোর জন্য তাদেরকে আবার প্লাস্টিকের মধ্যে পেস্ট করুন paste

আপনার কাজগুলি পিএসকিএল-তে পরীক্ষা করে দেখুন:

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

দুর্দান্ত সমাধান। আমার একমাত্র সমস্যা ছিল আমি স্ক্রিপ্টগুলি রফতানি করেছিলাম এবং তারপরে রফতানি স্ক্রিপ্টগুলি কার্যকর করেছিলাম। আমি এসকিউএল সার্ভার গুরু কিন্তু শর্টকাটটি কার্যকর করার জন্য আমি নিশ্চিত নই। আমি এক্সিকিউট ক্যোয়ারী এবং পিজিস্ক্রিপ্ট এক্সিকিউট করতে ক্লিক করেছি। আমি কী ভুল করছিলাম?
টাইরন মুডলি

1
এটি একবারে লগইন করে পিএলএসকিএল এর মধ্যে থেকে কাজ করার কারণে আমি এটিকে পছন্দ করেছি - ইউনিক্স স্তরের স্ক্রিপ্টগুলির (বর্তমানে পছন্দসই উত্তর) আমার পরিবেশে একটি "-U পোস্টগ্রাস" এবং পাসওয়ার্ড এন্ট্রি প্রয়োজন।
দাজ্জিত

2
আমি এই উত্তরটি পছন্দ করি কারণ (1) এটি পিএসকিএল বা পিজিএডমিনে করা যেতে পারে (2) এটি সহজেই আপনাকে যে জিনিসগুলি পরিবর্তন করতে হবে তা দেখতে দেয়। আমি স্ট্যাকওভারফ্লো / প্রশ্নগুলি / 22803096/ …ও ব্যবহার করেছি যা একই রকম তবে কার্যকারিতার জন্য।
অ্যালানারোজ


42

যদি আপনি এটি একটি স্কয়ার স্টেটমেন্টে করতে চান তবে আপনাকে 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;

US NEWUSER হ'ল নতুন মালিকের পোস্টগ্র্যাস্কল নতুন নাম।

বেশিরভাগ পরিস্থিতিতে এটি কার্যকর করার জন্য আপনাকে সুপারইউসার হতে হবে। আপনি নিজের ব্যবহারকারীকে কোনও ভূমিকা গোষ্ঠীতে পরিবর্তন করে আপনি এটিকে এড়াতে পারবেন।

এটিকে সাহায্য করার জন্য # পোষ্টগ্রাএসকিএল-তে রডোমিটোডকে ধন্যবাদ ।


2
এটি ফাংশন, সূচিপত্র, ক্রম ইত্যাদি সহ পুরো স্কিমার মালিকানা পরিবর্তন করার কারণে এটি আরও বেশি কার্যকর Thank ধন্যবাদ!
liviucmg

এটি স্কিমা মালিকদের পরিবর্তন করে না। স্কিমা মালিকরাও কীভাবে পরিবর্তন করবেন?
অ্যান্ডরাস

@ আন্ডারস অল্টার ডেটাবেস $ মালিকের কাছে ডিবি $ মালিক;
জোহান ডাহলিন

পরিবর্তিত ডাটাবেস পুরো ডাটাবেস মালিক পরিবর্তন করে। আমি জিজ্ঞাসা করেছি কীভাবে স্কিমা মালিকদের পরিবর্তন করবেন।
আন্দ্রেস

ALTER SCHEMA মালিককে বেটি বেঁধে দেয়;
এরিক আল্ডিংগার

21

আমাকে সম্প্রতি একটি ডাটাবেসে সমস্ত বস্তুর মালিকানা পরিবর্তন করতে হয়েছিল। যদিও সারণী, দর্শন, ট্রিগার এবং সিকোয়েন্সগুলি কিছু সহজেই ফাংশনগুলির জন্য উপরের পদ্ধতির ব্যর্থ হয়েছে কারণ স্বাক্ষরটি ফাংশন নামের অংশ। মঞ্জুর, আমার একটি মাইএসকিউএল ব্যাকগ্রাউন্ড আছে এবং পোস্টগ্রিসের সাথে তেমন পরিচিত না।

যাইহোক, pg_dump আপনাকে কেবল স্কিমা ডাম্প করার অনুমতি দেয় এবং এটিতে yYRE তে ALTER xxx মালিকানা রয়েছে; আপনার প্রয়োজন বিবৃতি। বিষয়টিতে শেল যাদুতে আমার বিটটি এখানে

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 - postgres
  2. psql
  3. পুনরায় স্বীকৃত [ওল্ড_উজার] দ্বারা [নতুন_ ব্যবহারকারী];
  4. \ সি [আপনার ডাটাবেস]
  5. পুনরায় স্বীকৃত [ওল্ড_উজার] দ্বারা [নতুন_ ব্যবহারকারী];

সম্পন্ন.


1
এটি সম্ভবত কুইন্টার যা চেয়েছিল তা করে does এখন পর্যন্ত সবচেয়ে সহজ।
জিওফ সাওয়ায়া

1
আপনি পার্টিতে মাত্র 4 বছর দেরী করেছেন; স্ক্রোল আপ: স্ট্যাকওভারফ্লো.com
বেন জনসন

16

আমি এই এক যেহেতু এটি পরিবর্তন মত টেবিল , মতামত , সিকোয়েন্স এবং ফাংশন একটি নির্দিষ্ট মালিক স্কিমা মধ্যে এক বারেই (এক SQL বিবৃতিতে), একটি ফাংশন তৈরি ছাড়া আপনি সরাসরি এটি ব্যবহার করতে পারেন PgAdmin তৃতীয় এবং psql :

(পোস্টগ্র্যাসস্কিল 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, @ অ্যালানারোজ, @ শ্যারুন থমাস, @ ব্যবহারকারী 3560574 এবং এই উত্তর দ্বারা প্রদত্ত উত্তরের ভিত্তিতে @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 পোস্ট করা দুর্দান্ত সমাধানটি ভালভাবে কাজ করে দেখেছে: যদি বস্তুর নামগুলি মিশ্র ক্ষেত্রে হয় (উদাহরণস্বরূপ "টেবিলনাম"), তবে এটি একটি ব্যর্থ হবে " পাওয়া যায়নি "-অররর।
এটির জন্য, অবজেক্টের নামগুলি এইভাবে "" "দিয়ে মুড়ে দিন:

টেবিল

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

আপনি পোস্টগ্রাইএসকিউএল 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 এ তেমন কোনও কমান্ড নেই। তবে গ্রান্টগুলির জন্য আমি কিছু সময় পূর্বে বর্ণিত পদ্ধতিটি ব্যবহার করে এটি ঘিরে কাজ করতে পারেন ।


ধন্যবাদ, খুব সুন্দর প্রবন্ধ. আমি এটি ভবিষ্যতের রেফারেন্স হিসাবে রাখব। পিজএডমিন ব্যবহার করে, আমি ডিবিটিকে ব্যাক আপ করেছিলাম, ডিবি ফেলে / মুছে ফেলছি, অস্থায়ীভাবে নতুন মালিককে প্রয়োজনীয় অধিকার প্রদান করব এবং তারপরে পুনরুদ্ধার উইন্ডোতে "মালিকানা নেই" বিকল্পটি পরীক্ষা করে নতুন মালিককে ডিবি পুনরায় তৈরি ও পুনরুদ্ধার করব। এই ফলাফলটি আমি নতুন মালিকের সাথে সমস্ত কিছুর মালিক হিসাবে সন্ধান করছি produced
কাই

Postgres 9.3 REASSIGN OWNED কমান্ডটি প্রবর্তন করেছে। postgresql.org/docs/9.3/sql-reassign-owned.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
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

যেহেতু কোনও মালিক অন্তর্ভুক্ত নেই তারপরে তৈরি করা টেবিল, স্কিমা ইত্যাদি সমস্ত আপনার দ্বারা নির্দিষ্ট করা লগইন ব্যবহারকারীর অধীনে তৈরি করা হবে।

আমি পড়েছি পোস্টগ্র্রেএসকিউএল সংস্করণগুলির মধ্যে স্থানান্তরিত করার জন্য এটি একটি ভাল পদ্ধতির হতে পারে।


2

আমি এটির জন্য একটি সুবিধাজনক স্ক্রিপ্ট তৈরি করেছি; পিজি_চেঞ্জ_ডিবি_মোনার.শ । এই স্ক্রিপ্টটি একটি ডাটাবেস স্কিমাতে সমস্ত সারণী, দর্শন, অনুক্রম এবং ফাংশনগুলির জন্য মালিকানা পরিবর্তন করে এবং নিজেই স্কিমার মালিক।

দয়া করে মনে রাখবেন যে আপনি যদি কোনও নির্দিষ্ট ডাটাবেসের ভূমিকার মালিকানাধীন কোনও নির্দিষ্ট ডাটাবেসে সমস্ত বস্তুর মালিকানা পরিবর্তন করতে চান, তবে আপনি REASSIGN OWNEDপরিবর্তে কমান্ডটি ব্যবহার করতে পারেন ।


1

পোস্টগ্রেএসকিউএল ৯.০ থেকে শুরু করে, আপনার বৈশিষ্ট্যটি GRANT [priv name] ON ALL [object type] IN SCHEMAকোথায় রয়েছে [priv name]তা সক্ষমতা রয়েছে SELECT, INSERT, UPDATE, DELETE, etcএবং এর মধ্যে [object type]একটি হতে পারেন:

  • TABLES
  • SEQUENCES
  • FUNCTIONS

পোস্টগ্রাইএসকিউএল এর ডকস চালু আছে GRANTএবং REVOKEএ সম্পর্কিত আরও বিশদে যান। কিছু পরিস্থিতিতে সিস্টেম ক্যাটালগগুলি ( pg_catalog.pg_*) জড়িত কৌশলগুলি এখনও ব্যবহার করা দরকার তবে এটি প্রায় সাধারণ নয়। আমি প্রায়শই নিম্নলিখিতগুলি করি:

  1. BEGIN সরকারী সংশোধন করার জন্য একটি লেনদেন
  2. DATABASESএকটি "ডিবিএ ভূমিকা" এর মালিকানা পরিবর্তন করুন
  3. SCHEMAS"ডিবিএ ভূমিকা" এর মালিকানা পরিবর্তন করুন
  4. REVOKE ALLসব privs TABLES, SEQUENCESএবং FUNCTIONSসব ভূমিকা থেকে
  5. GRANT SELECT, INSERT, UPDATE, DELETE উপযুক্ত ভূমিকার ক্ষেত্রে প্রাসঙ্গিক / উপযুক্ত টেবিলগুলিতে
  6. COMMIT ডিসিএল লেনদেন

1

গৃহীত সমাধানটি ফাংশন মালিকানার যত্ন নেয় না নিম্নলিখিত সমাধানটি সমস্ত কিছুর যত্ন নেয় (পর্যালোচনা করার সময় আমি লক্ষ্য করেছি যে এটি @ ম্যাজিকোনায়ারের অনুরূপ)

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

ডকার: সমস্ত টেবিলের + সিকোয়েন্সগুলির মালিককে সংশোধন করুন

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.