คุณควรจัดการแคตตาล็อกระบบโดยตรงเท่านั้นหากคุณรู้ว่าคุณกำลังทำอะไรอยู่ มันอาจมีผลข้างเคียงที่ไม่คาดคิด หรือคุณอาจเสียหายฐานข้อมูล (หรือกลุ่มฐานข้อมูลทั้งหมด) เกินกว่าจะซ่อม
คำตอบของ Jeremyในขณะที่ทำเคล็ดลับไม่แนะนำให้สาธารณะชนทั่วไปทำ มันไม่มีการเปลี่ยนแปลงฟังก์ชั่นทั้งหมดในสคีมาโดยไม่มีเงื่อนไข คุณแน่ใจหรือว่าไม่มีฟังก์ชั่นของระบบที่ได้รับผลกระทบหรือฟังก์ชั่นที่ติดตั้งโดยโมดูลเพิ่มเติม?
มันจะไม่มีประโยชน์ที่จะเปลี่ยนเจ้าของฟังก์ชั่นที่เป็นเจ้าของแล้ว
ก่อนอื่นให้ตรวจสอบว่าREASSIGN OWNED
สามารถทำงานให้คุณได้หรือไม่:
เปลี่ยนความเป็นเจ้าของของวัตถุฐานข้อมูลที่เป็นเจ้าของโดยบทบาทฐานข้อมูล
คุณต้องแสดงบทบาททั้งหมดที่จะปฏิเสธอย่างชัดเจน แต่มันก็ยัง reassigns ฟังก์ชั่น
ในการกำหนดฟังก์ชั่นทั้งหมด (และไม่มีวัตถุอื่น) ในสคีมาที่กำหนดให้กับเจ้าของใหม่ (เป็นทางเลือกโดยไม่คำนึงถึงเจ้าของก่อนหน้า):
SELECT string_agg('ALTER FUNCTION ' || oid::regprocedure || ' OWNER TO foo;', E'\n') AS ddl
FROM pg_catalog.pg_proc p
JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
WHERE n.nspname = 'public';
-- AND p.relowner <> (SELECT oid FROM pg_roles WHERE rolname = 'foo')
-- AND p.proname ~~ 'f_%'
สิ่งนี้จะสร้างคำสั่ง canonical SQLALTER FUNCTION ...
เพื่อเปลี่ยนฟังก์ชั่นทั้งหมด (ในสคีมาที่ระบุ) คุณสามารถตรวจสอบคำสั่งก่อนที่จะดำเนินการ - หนึ่งโดยหนึ่งหรือทั้งหมดในครั้งเดียว:
ALTER FUNCTION public.bar(text, text) OWNER TO foo;
ALTER FUNCTION public.foo(x integer) OWNER TO foo;
...
ฉันได้รวมWHERE
ข้อความที่มีความคิดเห็นบางส่วนที่คุณอาจต้องการใช้เพื่อกรองผลลัพธ์
หล่อการregprocedure
ผลิตชื่อฟังก์ชั่นที่ถูกต้องกับพารามิเตอร์สองครั้งที่ยกมาในกรณีที่จำเป็นคีมา - search_path
มีคุณสมบัติที่จำเป็นสำหรับปัจจุบัน
ฟังก์ชันการรวมstring_agg ()ต้องใช้ PostgreSQL 9.0 หรือใหม่กว่า ในแทนรุ่นเก่าด้วยและarray_agg()
array_to_string()
คุณสามารถใส่ทั้งหมดนี้ลงในDO
คำสั่งหรือฟังก์ชันที่แสดงในคำตอบที่เกี่ยวข้องนี้:
ใน Postgres 9.5หรือใหม่กว่าคุณสามารถทำให้การสืบค้นง่ายขึ้นโดยใช้ตัวระบุวัตถุชนิดใหม่regnamespace
และregrole
:
SELECT string_agg('ALTER FUNCTION '|| oid::regprocedure || ' OWNER TO foo;', E'\n') AS ddl
FROM pg_catalog.pg_proc
WHERE pronamespace = 'public'::regnamespace;
-- AND relowner <> 'foo'::regrole
-- AND proname ~~ 'f_%'
pg_proc.proisagg
จะถูกแทนที่ใน PG 11. บันทึกประจำรุ่นกล่าวว่าแทนที่ตารางระบบpg_proc
'sproisagg
และproiswindow
ด้วยprokind
(ปีเตอร์ Eisentraut) `