PostgreSQL เปลี่ยนเจ้าของของตารางทั้งหมดภายใต้สคีมาที่เฉพาะเจาะจง


19

ฉันกำลังพยายามเปลี่ยนเจ้าของตารางทั้งหมดภายใต้สคีเดียวกันในบรรทัดคำสั่งเดียว alter table schema_name.* owner to newownerเช่น: มีวิธีสำเร็จหรือไม่

คำตอบ:


11

กำหนดให้เป็นเจ้าของแล้ว

RESASSIGN OWNEDมีคำสั่งที่ระบุสิทธิพิเศษที่ไม่เพียงแค่นี้ก็คือ สิ่งนี้จะกำหนดวัตถุทั้งหมดไม่ใช่วัตถุในสคีมาที่เฉพาะเจาะจง

Schema เฉพาะ

คุณสามารถสร้างALTER TABLEคำสั่งดังต่อไปนี้

SELECT format(
  'ALTER TABLE %I.%I.%I OWNER TO %I;',
  table_catalog,
  table_schema,
  table_name,
  current_user  -- or another just put it in quotes
)
FROM information_schema.tables
WHERE table_schema = 'mySchema';

ใน psql คุณสามารถเรียกใช้ได้โดยทำตามทันที \gexec


8

ฉันไม่ทราบวิธีใด ๆ ในการทำสิ่งนี้ให้สำเร็จผ่าน psql แต่ใช้ bash คุณสามารถแสดงรายการตารางในฐานข้อมูล $ DB ด้วย:

psql -tc "select tablename from pg_tables where schemaname = '${SCHEMA}';" ${DB}

และสามารถโอนความเป็นเจ้าของให้กับ $ OWNER ด้วย:

psql -c "alter table ${SCHEMA}.${table} owner to ${OWNER}" ${DB}

การรวมสิ่งนี้เข้าด้วยกันจะช่วยให้คุณ:

 $ for table in `psql -tc "select tablename from pg_tables where schemaname = '${SCHEMA}';" ${DB}` ; do  psql -c "alter table ${SCHEMA}.${table} owner to ${OWNER}" ${DB} ; done

$ DB, $ SCHEMA และ $ OWNER เป็นตัวแทนของฐานข้อมูล schema (โดยปกติคือ 'สาธารณะ') และชื่อเจ้าของใหม่ตามลำดับ


7

หากคุณสามารถสืบค้น tablenames ในสคีมาของคุณคุณสามารถสร้างคิวรีเพื่อเปลี่ยนความเป็นเจ้าของตาราง

ตัวอย่างเช่น:

 select 'ALTER TABLE ' || t.tablename || ' OWNER TO new_owner;' 
 from  pg_tables t
 where t.tableowner != 'rdsadmin';

จะส่งคืนแบบสอบถามเพื่อเปลี่ยนความเป็นเจ้าของของตารางทั้งหมด:

ALTER TABLE schema_version OWNER TO ali;
ALTER TABLE users OWNER TO ali; 
ALTER TABLE company OWNER TO ali;
ALTER TABLE books OWNER TO ali;
...

จากนั้นคุณสามารถเรียกใช้เหล่านี้ :)



0

คล้ายกับข้างต้นโดยใช้ทุบตี แต่ฉันต้องออกในไฟล์ข้อความแล้วใส่ลงใน psql:

$ psql -qAt -d mydatabase -c "SELECT 'ALTER TABLE '||schemaname||'.'||tablename||' \
                                      OWNER TO new_owner;' \
                                      FROM pg_tables \
                                      WHERE schemaname = 'myschema'" > data.txt


$ psql < data.txt -d mydatabase

ขึ้นอยู่กับสิ่งนี้ แต่เพิ่มฐานข้อมูล: http://penningpence.blogspot.ca/2014/09/changing-owner-of-multiple-database.html


0

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

ต่อไปนี้จะเปลี่ยนสิทธิ์ผ่านฟังก์ชั่น plpgsql:

CREATE OR REPLACE FUNCTION YOURSCHEMA.do_changeowner(
    newowner text,
    pschem text)
  RETURNS void AS
$BODY$
declare
  tblnames CURSOR FOR
    SELECT tablename FROM pg_tables
    WHERE schemaname = pschem;
  viewnames CURSOR FOR
    SELECT viewname FROM pg_views
    WHERE schemaname = pschem;
  funcnames CURSOR FOR
    SELECT p.proname AS name, pg_catalog.pg_get_function_identity_arguments(p.oid) as params
    FROM pg_proc p 
    JOIN pg_namespace n ON n.oid = p.pronamespace 
    WHERE n.nspname = pschem;

begin

  FOR stmt IN tblnames LOOP
    EXECUTE 'alter TABLE ' || pschem || '.' || stmt.tablename || ' owner to ' || newowner || ';';
  END LOOP;
  FOR stmt IN viewnames LOOP
    EXECUTE 'alter VIEW ' || pschem || '.' || stmt.viewname || ' owner to ' || newowner || ';';
  END LOOP;
  FOR stmt IN funcnames LOOP
    EXECUTE 'alter FUNCTION ' || pschem || '.' || stmt.name || '(' ||  stmt.params || ') owner to ' || newowner || ';';
  END LOOP;

END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.