มีหนึ่งซับไลน์ที่ให้สิทธิ์ SELECTแก่ผู้ใช้ใหม่ postgresql หรือไม่?
สิ่งที่จะใช้โค้ดหลอกต่อไปนี้:
GRANT SELECT ON TABLE * TO my_new_user;
มีหนึ่งซับไลน์ที่ให้สิทธิ์ SELECTแก่ผู้ใช้ใหม่ postgresql หรือไม่?
สิ่งที่จะใช้โค้ดหลอกต่อไปนี้:
GRANT SELECT ON TABLE * TO my_new_user;
คำตอบ:
ฉันคิดว่ามันอาจจะมีประโยชน์ที่จะกล่าวถึงว่าในขณะที่ 9.0 postgres มีไวยากรณ์เพื่อให้สิทธิ์ในตารางทั้งหมด (รวมถึงวัตถุอื่น ๆ ) ในสคีมา:
GRANT SELECT ON ALL TABLES IN SCHEMA public TO user;
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO user;
default privileges
บน schema โดยที่ ytou สร้างตาราง: postgresql.org/docs/current/static/…
public
สำหรับฐานข้อมูลปัจจุบันที่คุณเชื่อมต่ออยู่
โซลูชัน (ไม่ใช่ซับใน) ของฉัน:
#!/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
เรียกใช้จากผู้ใช้ที่ได้รับสิทธิพิเศษมันทำงานเหมือนมีเสน่ห์
สามารถทำได้ด้วยกระบวนการสองขั้นตอน
เรียกใช้แบบสอบถามนี้:
select 'grant all on '||schemaname||'.'||tablename||' to $foo;'
from pg_tables where schemaname in ('$bar', '$baz')
order by schemaname, tablename;
เปลี่ยน:
$foo
= ชื่อผู้ใช้ที่คุณต้องการให้สิทธิ์สำหรับ
$bar
, $baz
= schema ที่คุณต้องการที่จะให้สิทธิ์ใน (อาจจะเป็นแค่ "สาธารณะ")
ที่จะให้รายการของแบบสอบถามที่จะสร้างสิทธิ์ที่จำเป็น คัดลอกผลลัพธ์วางลงในแบบสอบถามอื่นและดำเนินการ
นี่คือสิ่งที่ฉันใช้:
psql dbname -tc "select 'grant select on '||relname||' to readonly;' from pg_stat_user_tables" | psql dbname
ฉันรู้สึกว่าเป็นเรื่องธรรมชาติมากที่จะทำการจัดรูปแบบและคำสั่งใน sql ..
ฉันลงเอยด้วยการทำสิ่งนี้และมันได้ผล:
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON TABLES TO PUBLIC;
ฉันทำงานกับ 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
วิธีหนึ่งในการแก้ไขปัญหานี้คือการเขียนกระบวนงานที่เก็บไว้ น่าเสียดายที่ไม่มีคำสั่ง "ให้สิทธิ์ทุกอย่างแก่ทุกตาราง" คุณต้องการโพรซีเดอร์หรือสคริปต์เชลล์ภายนอกบางอันอาจทำให้การทำงานนี้สำเร็จ
สคริปต์ (โซลูชันแบบหนึ่งซับ) โดย 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