ปรับเปลี่ยน OWNER ในทุกตารางพร้อมกันใน PostgreSQL


410

ฉันจะแก้ไขเจ้าของตารางทั้งหมดในฐานข้อมูล 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
David

64
การจัดประเภทใหม่เป็นเจ้าของโดยจะไม่ทำงานสำหรับวัตถุที่เป็นของ postgres
BrunoJCM

19
นอกจากนี้การจัดประเภทใหม่จะมีผลกับการเป็นเจ้าของฐานข้อมูลทั้งหมดที่เป็นเจ้าของโดยบทบาทเก่า (ดู: postgresql.org/docs/9.3/static/sql-reassign-owned.html ) ดังนั้นหากคุณต้องการเปลี่ยนความเป็นเจ้าของของฐานข้อมูลเดียวระวัง!
kitsune

3
ขึ้นอยู่กับสคริปต์ @gingerlime bspkrs (ไม่สามารถหาชื่อของเขาได้) สร้างหนึ่งที่เปลี่ยนการทำงาน: https://gist.github.com/bspkrs/b997ed7f1eb1268f3403
elysch

538

คุณสามารถใช้REASSIGN OWNEDคำสั่ง

สรุป:

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

สิ่งนี้จะเปลี่ยนวัตถุทั้งหมดที่เป็นold_roleของบทบาทใหม่ คุณไม่ต้องคิดเกี่ยวกับวัตถุชนิดใดที่ผู้ใช้มีพวกเขาทั้งหมดจะถูกเปลี่ยน โปรดทราบว่าจะใช้กับวัตถุที่อยู่ในฐานข้อมูลเดียวเท่านั้น ไม่เปลี่ยนแปลงเจ้าของฐานข้อมูลเอง

มันสามารถใช้ได้อย่างน้อย 8.2 เอกสารออนไลน์ของพวกเขากลับไปไกลมาก


ERROR: unexpected classid 3079. ฉันเดาว่าจะไม่ทำงานหากมีส่วนขยายใด ๆ
Steve Jorgensen

40
ดูเหมือนว่านี่จะไม่ทำงานสำหรับผู้ใช้ postgres แม้ว่าฉันจะเชื่อมต่อกับฐานข้อมูลที่ฉันสร้างขึ้น (เช่นไม่ใช่ฐานข้อมูลระบบ) แต่มันก็บอกว่าสิ่งนี้: ข้อผิดพลาด: ไม่สามารถมอบหมายกรรมสิทธิ์ในวัตถุที่เป็นเจ้าของโดยบทบาท postgres ได้ ระบบ
thnee

13
ตามที่ @thnee รายงานว่าการจัดประเภทใหม่มีผลกับวัตถุทั้งหมดในฐานข้อมูลและไม่แยกความแตกต่างระหว่างผู้ใช้ที่กำหนดและวัตถุระบบดังนั้นจึงไม่สามารถทำงานได้สำหรับ postgres หากมีส่วนขยายใด ๆ ที่มีตารางของตัวเอง ฉันยังคงชอบ (+1) ตัวเลือกนี้เพื่อความสง่างามแม้ว่ามันจะไม่ได้ช่วยฉันมากนัก (ฐานข้อมูลของฉันเป็นเจ้าของโดย postgres ก่อนหน้านี้)
Pavel V.

6
เพื่อให้ชัดเจนคำสั่งนี้ทำงานในฐานข้อมูลที่คุณเชื่อมต่อในปัจจุบันเท่านั้น หาก old_role เป็นเจ้าของวัตถุในหลายฐานข้อมูลคุณควรเชื่อมต่อและเรียกใช้คำสั่งนี้ในแต่ละฐานข้อมูลเหล่านั้น
mavroprovato

11
ดูเหมือนว่านี่จะไม่ทำงานกับ postgres ที่โฮสต์ผ่าน AWS RDS ฉันได้รับข้อผิดพลาดนี้ "การอนุญาตปฏิเสธที่จะมอบหมายวัตถุ" และลิงก์นี้แสดงให้เห็นว่าทำไม: "ดูเหมือนว่าวิธีเดียวในการ 'มอบหมายการเป็นเจ้าของใหม่' ให้เป็น superuser (ซึ่งขัดแย้งกับเอกสาร) ซึ่งไม่สามารถเข้าถึงได้ ใน RDS. ' postgresql-archive.org/…
typoerrpr

196

นี้: http://archives.postgresql.org/pgsql-bugs/2007-10/msg00234.phpเป็นวิธีที่ดีและรวดเร็วและทำงานได้หลาย schemas ในฐานข้อมูลเดียว:

ตาราง

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/ ที่จำเป็นทั้งหมดคัดลอกสิ่งเหล่านี้และวางลงใน plsql เพื่อเรียกใช้ALTER SEQUENCEALTER VIEW

ตรวจสอบงานของคุณเป็น psql โดยทำ:

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

ทางออกที่ดี ปัญหาเดียวของฉันคือฉันได้ส่งออกสคริปต์แล้วรันสคริปต์ส่งออก ฉันเป็นกูรูเซิร์ฟเวอร์ SQL แต่ฉันไม่แน่ใจว่าทางลัดคืออะไรในการดำเนินการ ฉันคลิกเรียกใช้คิวรีและเรียกใช้ pgScript ฉันทำอะไรผิด
Tyrone Moodley

1
ฉันชอบสิ่งนี้เพราะมันทำงานได้จากภายใน plsql เมื่อเข้าสู่ระบบ - สคริปต์ระดับยูนิกซ์ (คำตอบที่โปรดปรานในปัจจุบัน) ต้องการ "-U postgres" และการป้อนรหัสผ่านในสภาพแวดล้อมของฉัน
งงงวย

2
ฉันชอบคำตอบนี้เพราะ (1) สามารถทำได้ใน psql หรือ pgAdmin (2) ช่วยให้คุณเห็นวัตถุที่คุณกำลังจะเปลี่ยนแปลงได้อย่างง่ายดาย ฉันยังใช้stackoverflow.com/questions/22803096/…ซึ่งคล้ายกัน แต่สำหรับฟังก์ชั่น
Alanna เพิ่มขึ้น

ตรรกะที่ยอดเยี่ยม
Emipro Technologies Pvt. จำกัด จำกัด

42

หากคุณต้องการที่จะทำมันในหนึ่งคำสั่ง sql คุณจะต้องกำหนดฟังก์ชั่น exec () ดังกล่าวใน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 ของเจ้าของใหม่

ในสถานการณ์ส่วนใหญ่คุณจะต้องเป็น superuser ในการดำเนินการนี้ คุณสามารถหลีกเลี่ยงได้โดยเปลี่ยนเจ้าของจากผู้ใช้ของคุณเองเป็นกลุ่มบทบาทที่คุณเป็นสมาชิก

ขอบคุณ RhodiumToad ใน#postgresql ที่ช่วยเหลือสิ่งนี้


2
สิ่งนี้มีประโยชน์มากขึ้นเพราะมันเปลี่ยนความเป็นเจ้าของของ schema ทั้งหมดรวมถึงฟังก์ชั่นดัชนีลำดับ ฯลฯ ขอบคุณ!
liviucmg

มันไม่ได้เปลี่ยนเจ้าของสคีมา จะเปลี่ยนเจ้าของสคีมาได้อย่างไร
Andrus

@Andrus เปลี่ยนฐานข้อมูล $ DB OWNER เป็น $ OWNER;
Johan Dahlin

แก้ไขการเปลี่ยนแปลงฐานข้อมูลเจ้าของฐานข้อมูลทั้งหมด ฉันถามวิธีเปลี่ยนเจ้าของสคีมา
Andrus

ALTER SCHEMA เปลี่ยนเฟร็ดเป็นเจ้าของ
Eric Aldinger

21

ฉันเพิ่งเปลี่ยนความเป็นเจ้าของของวัตถุทั้งหมดในฐานข้อมูล แม้ว่าตารางมุมมองทริกเกอร์และลำดับจะค่อนข้างง่ายเปลี่ยนวิธีการข้างต้นล้มเหลวสำหรับฟังก์ชั่นเนื่องจากลายเซ็นเป็นส่วนหนึ่งของชื่อฟังก์ชั่น ได้รับฉันมีพื้นหลัง MySQL และไม่คุ้นเคยกับ Postgres

อย่างไรก็ตามpg_dumpอนุญาตให้คุณดัมพ์เฉพาะสกีมาและสิ่งนี้มีALTER 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คำสั่ง ฉันใหม่สำหรับ Linux ด้วยตัวเอง แต่จากความเข้าใจของฉันดูเหมือนว่าใช้ได้sedดีโดยเฉพาะอย่างยิ่งเมื่อคุณระบุการจับคู่แบบตรงและตัวพิมพ์เล็ก
Bobort

19

ง่ายมากลองดูสิ ...

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

4
คุณอาจเพิ่มบันทึกย่อที่จะต้องคัดลอกและดำเนินการสตริงที่เกี่ยวข้อง ไม่ใช่ว่ามันไม่ชัดเจน: p
Nightscape

ซึ่งรวมถึงการลบเครื่องหมายคำพูดทั้งหมดรอบคำสั่งแก้ไข .. มัลติเคอร์เซอร์หรือแทนที่ช่วยในกรณีนี้
knownasilya

19

ง่ายมาก

  1. su - postgres
  2. psql
  3. จัดประเภทใหม่เป็นเจ้าของโดย [old_user] ถึง [new_user];
  4. \ c [ฐานข้อมูลของคุณ]
  5. จัดประเภทใหม่เป็นเจ้าของโดย [old_user] ถึง [new_user];

เสร็จแล้ว


1
นี่อาจเป็นสิ่งที่ผู้ถามต้องการ โดยวิธีที่ง่ายที่สุด
Geof Sawaya

1
คุณมางานปาร์ตี้ช้าแค่ 4 ปี เลื่อนขึ้น: stackoverflow.com/a/13535184/1772379
Ben Johnson

16

ฉันเช่นนี้เพราะมันปรับเปลี่ยนตาราง , มุมมอง , ลำดับและฟังก์ชั่นเจ้าของบางสคีในหนึ่งไป (ในหนึ่งคำสั่ง SQL) โดยไม่ต้องสร้างฟังก์ชั่นและคุณสามารถใช้งานได้โดยตรงในpgAdmin IIIและ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, @ user3560574 และคำตอบนี้โดย @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$$;

น่าทึ่ง! ทำไม postgres ไม่เพิ่มสิ่งนี้ฉันไม่รู้!
pip

สองคำถาม: 1) ดูเหมือนว่าบรรทัด "ALTER TABLE" ตัวแรกและตัวที่สามเป็นแบบคู่ เป็นความตั้งใจนั้นหรือไม่ (เช่นคุณต้องผ่านไปสองตารางเพื่อเปลี่ยนความเป็นเจ้าของหรือไม่) 2) เราพบว่าinformation_schema.sequencesว่างเปล่าแม้ว่าSELECT c.* FROM pg_class c WHERE c.relkind = 'S';จะเรียงลำดับ ทำไมพวกเขาถึงไม่ตรงกัน
GuyPaddock

นอกจากนี้ALTERแบบสอบถามที่สองไม่ควรALTER SEQUENCEใช่หรือไม่
GuyPaddock

12

ฉันต้องเปลี่ยนความเป็นเจ้าของของตารางมุมมองและลำดับและพบทางออกที่ดีที่โพสต์โดย @rjk ทำงานได้ดี - แม้จะมีหนึ่งรายละเอียด: ถ้าชื่อวัตถุเป็นกรณีผสม (เช่น "TableName") สิ่งนี้จะล้มเหลวด้วย " ไม่พบ "-error
ในการหลีกเลี่ยงสิ่งนี้ให้ล้อมชื่อวัตถุด้วย '"' ดังนี้:

ตาราง

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 ฉันได้ทำการสำรองฐานข้อมูลวาง / ลบฐานข้อมูลให้สิทธิ์ที่จำเป็นแก่ new_owner ชั่วคราวจากนั้นสร้างใหม่และเรียกคืนฐานข้อมูลเป็น new_owner โดยตรวจสอบตัวเลือก "ไม่มีเจ้าของ" ในหน้าต่างกู้คืน สิ่งนี้สร้างผลลัพธ์ที่ฉันต้องการโดยมี new_owner เป็นเจ้าของทุกสิ่ง
Kai

Postgres 9.3 แนะนำคำสั่ง REASSIGN OWNED postgresql.org/docs/9.3/sql-reassign-owned.html
Georg Zimmer

3

จากคำตอบของ elyschนี่คือวิธีแก้ปัญหาสำหรับ schema หลาย ๆ ตัว:

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

คำตอบโดย @Alex Soto เป็นคำตอบที่ถูกต้องและส่วนสำคัญที่อัพโหลดโดย @Yoav Aner สามารถใช้ได้หากไม่มีอักขระพิเศษในชื่อตาราง / มุมมอง (ซึ่งถูกกฎหมายใน postgres)

คุณต้องหลบหนีพวกเขาให้ทำงานและฉันได้อัพโหลดส่วนสำคัญสำหรับสิ่งนั้น: 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 )

จากนั้นไพพ์ไฟล์สำรองข้อมูลกลับไปยัง PostgreSQL โดยใช้:

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

เนื่องจากไม่มีเจ้าของรวมอยู่จึงสร้างตาราง schema ฯลฯ ทั้งหมดที่สร้างขึ้นภายใต้ผู้ใช้ที่คุณระบุ

ฉันได้อ่านสิ่งนี้อาจเป็นวิธีที่ดีสำหรับการย้ายระหว่างรุ่น 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 ธุรกรรมเพื่อแก้ไข privs
  2. เปลี่ยนความเป็นเจ้าของDATABASESเป็น "บทบาท DBA"
  3. เปลี่ยนความเป็นเจ้าของของSCHEMASเป็น "บทบาท DBA"
  4. REVOKE ALLPRIVS ในทุกTABLES, SEQUENCESและFUNCTIONSจากบทบาททั้งหมด
  5. GRANT SELECT, INSERT, UPDATE, DELETE บนตารางที่เกี่ยวข้อง / เหมาะสมกับบทบาทที่เหมาะสม
  6. COMMIT ธุรกรรม DCL

1

โซลูชันที่ได้รับการยอมรับไม่ได้ดูแลความเป็นเจ้าของฟังก์ชั่นดังต่อไปนี้โซลูชันจะดูแลทุกอย่าง (ในขณะที่ตรวจสอบฉันสังเกตเห็นว่ามันคล้ายกับ @magiconair ด้านบน)

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

เหมือนกับแนวทางของ @ AlexSoto สำหรับฟังก์ชั่น:

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.