GRANT SELECT ให้กับตารางทั้งหมดใน postgresql


คำตอบ:


144

ฉันคิดว่ามันอาจจะมีประโยชน์ที่จะกล่าวถึงว่าในขณะที่ 9.0 postgres มีไวยากรณ์เพื่อให้สิทธิ์ในตารางทั้งหมด (รวมถึงวัตถุอื่น ๆ ) ในสคีมา:

GRANT SELECT ON ALL TABLES IN SCHEMA public TO user;
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO user;

นี่คือการเชื่อมโยง


ฉันจะอัพเกรดเร็ว ๆ นี้ดังนั้นนี่เป็นข่าวดีจริงๆ ขอบคุณ!
Adam Matan

สิ่งนี้มีผลต่อฐานข้อมูลทั้งหมดบนเซิร์ฟเวอร์ที่ใช้สคีมาสาธารณะหรือไม่
kristianp

5
หากฉันสร้างตารางใหม่ผู้ใช้รายนี้จะสามารถเข้าถึงตารางที่สร้างขึ้นใหม่ได้หรือไม่
GuiSim

8
@GuiSim ไม่คุณต้องตั้งค่าdefault privilegesบน schema โดยที่ ytou สร้างตาราง: postgresql.org/docs/current/static/…
SkyRaT

@kristianp ไม่ทุกฐานข้อมูลในคลัสเตอร์ PG มีสคีมาสาธารณะของตัวเอง มันมีผลต่อตาราง (ฟังก์ชั่น) ทั้งหมดในสคีมาpublicสำหรับฐานข้อมูลปัจจุบันที่คุณเชื่อมต่ออยู่
SkyRaT

11

โซลูชัน (ไม่ใช่ซับใน) ของฉัน:

#!/bin/bash

for table in `echo "SELECT schemaname || '.' || relname FROM pg_stat_user_tables;" | psql -A -t my_database_name`;
do
    echo "GRANT SELECT ON TABLE $table to my_new_user;"
    echo "GRANT SELECT ON TABLE $table to my_new_user;" | psql my_database_name
done

เรียกใช้จากผู้ใช้ที่ได้รับสิทธิพิเศษมันทำงานเหมือนมีเสน่ห์


3
หากคุณใช้ pg_stat_user_tables แทน all_tables คุณไม่จำเป็นต้องใช้ grep ของคุณ ... นอกจากนี้ให้ส่ง -A -t ไปที่ psql เพื่อกำจัดเอาต์พุตที่จัดรูปแบบแล้ว
Magnus Hagander

1
โปรดทราบว่าในขณะที่ Postgres 9.0 แนวทางของคำตอบนี้กำลังทำอย่างหนัก ใน 9.x ตอนนี้เราเห็น "ON ALL" ในคำตอบอื่น ๆแล้ว
Basil Bourque

อันนี้ไม่ทำงานที่ชื่อตารางหรือสคีมามีตัวอักษรตัวพิมพ์ใหญ่ การเพิ่มเวอร์ชั่นที่แก้ไขด้านล่าง
anneb

9

สามารถทำได้ด้วยกระบวนการสองขั้นตอน

  1. เรียกใช้แบบสอบถามนี้:

    select 'grant all on '||schemaname||'.'||tablename||' to $foo;'
    from pg_tables where schemaname in ('$bar', '$baz')
    order by schemaname, tablename;
    

    เปลี่ยน:

    $foo= ชื่อผู้ใช้ที่คุณต้องการให้สิทธิ์สำหรับ
    $bar, $baz= schema ที่คุณต้องการที่จะให้สิทธิ์ใน (อาจจะเป็นแค่ "สาธารณะ")

  2. ที่จะให้รายการของแบบสอบถามที่จะสร้างสิทธิ์ที่จำเป็น คัดลอกผลลัพธ์วางลงในแบบสอบถามอื่นและดำเนินการ


2

นี่คือสิ่งที่ฉันใช้:

psql dbname -tc "select 'grant select on '||relname||' to readonly;' from pg_stat_user_tables" | psql dbname

ฉันรู้สึกว่าเป็นเรื่องธรรมชาติมากที่จะทำการจัดรูปแบบและคำสั่งใน sql ..



1

ฉันทำงานกับ postgres 8.4 และเพื่อมอบสิทธิ์ทั้งหมดให้กับผู้ใช้ให้ทำดังนี้:

#!/bin/bash

for table in `echo "SELECT schemaname||'.'||relname FROM pg_stat_all_tables WHERE schemaname NOT IN('pg_catalog','pg_toast','information_schema')" | psql -t db `;
do
    echo "grant select on table $table to my_new_user;"
    echo "grant select on table $table to my_new_user;" | psql db
done

1
เป็นภาษาอังกฤษ.
อิทธิพล

0

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


0

สคริปต์ (โซลูชันแบบหนึ่งซับ) โดย Adam Matan นั้นยอดเยี่ยมเมื่อมีสคีมาจำนวนมาก แต่มันไม่ทำงานเมื่อชื่อสคีมาหรือชื่อตารางมีตัวอักษรตัวพิมพ์ใหญ่หรืออักขระพิเศษ

เวอร์ชั่นที่แก้ไข:

#!/bin/bash

for table in `echo "SELECT '\"' || schemaname || '\".\"' || relname || '\"'  FROM pg_stat_user_tables;" | psql -A -t my_database_name`;
do
    echo "GRANT SELECT ON TABLE $table to my_new_user;"
    echo "GRANT SELECT ON TABLE $table to my_new_user;" | psql my_database_name
done
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.