ฉันกำลังพยายามเปลี่ยนเจ้าของตารางทั้งหมดภายใต้สคีเดียวกันในบรรทัดคำสั่งเดียว alter table schema_name.* owner to newowner
เช่น: มีวิธีสำเร็จหรือไม่
ฉันกำลังพยายามเปลี่ยนเจ้าของตารางทั้งหมดภายใต้สคีเดียวกันในบรรทัดคำสั่งเดียว alter table schema_name.* owner to newowner
เช่น: มีวิธีสำเร็จหรือไม่
คำตอบ:
RESASSIGN OWNED
มีคำสั่งที่ระบุสิทธิพิเศษที่ไม่เพียงแค่นี้ก็คือ สิ่งนี้จะกำหนดวัตถุทั้งหมดไม่ใช่วัตถุในสคีมาที่เฉพาะเจาะจง
คุณสามารถสร้าง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
ฉันไม่ทราบวิธีใด ๆ ในการทำสิ่งนี้ให้สำเร็จผ่าน 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 (โดยปกติคือ 'สาธารณะ') และชื่อเจ้าของใหม่ตามลำดับ
หากคุณสามารถสืบค้น 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;
...
จากนั้นคุณสามารถเรียกใช้เหล่านี้ :)
สคริปต์นี้จะทำเคล็ดลับ
sh change_owner.sh -n new_owner -S schema_name
sh change_owner.sh -n user1 -S public
Summary:
Tables/Sequences/Views : 16
Functions : 43
Aggregates : 1
Type : 2
พบได้ที่นี่https://github.com/trrao/PostgreSQL_Scripts
คล้ายกับข้างต้นโดยใช้ทุบตี แต่ฉันต้องออกในไฟล์ข้อความแล้วใส่ลงใน 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
นี่คือฟังก์ชั่นที่ฉันใช้สำหรับเปลี่ยนตารางมุมมองและความเป็นเจ้าของฟังก์ชันในสคีมา มันรวดเร็วสะอาดและเป็นตัวอย่างที่ดีของวิธีใช้เคอร์เซอร์เช่นกัน นอกจากนี้ไม่จำเป็นต้องมีบรรทัดคำสั่ง
ต่อไปนี้จะเปลี่ยนสิทธิ์ผ่านฟังก์ชั่น 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;