ปัญหาในกรณีนั้นไม่เกี่ยวกับคำสั่งอนุญาต แต่เป็นคำสั่งดำเนินการ
ในประวัติย่อสำหรับ PostgreSQL:
1- มุมมองที่เป็นตาราง acessing จะแทนที่สิทธิ์ตาราง
2- มุมมอง acessing ฟังก์ชั่นจะต้องประเมินฟังก์ชั่นทั้งหมดก่อนที่จะถูกตรวจสอบ - ดังนั้นฟังก์ชั่นจะต้องดำเนินการก่อนที่จะ acessing มุมมองแม้ว่ามุมมองที่ไม่ได้มีสิทธิ์เลือก ...
เราจะพิสูจน์ได้อย่างไร
ใน postgresql มุมมองสามารถให้สิทธิ์คุณสำหรับการเลือกในตารางแม้ว่าผู้ใช้จะไม่มีสิทธิ์นี้
ตัวอย่างเช่น:
create view view2 as select * from table1;
revoke all on table1 from user1;
grant select on view2 to user1;
เข้าสู่ระบบในฐานะผู้ใช้ 1:
select * from table1 (permission denied)
select * from view2 (sucess - the query executes)
ในกรณีนี้ผู้ใช้จะสามารถเลือก view2 แม้จะไม่ได้รับอนุญาตให้เลือกตาราง
แต่สิ่งที่ถ้าเราทำสิ่งเดียวกันกับฟังก์ชั่น ? พฤติกรรมไม่เหมือนกัน ให้สร้างฟังก์ชันที่รอ 5 วินาทีก่อนส่งคืน 1 (เพื่อให้เราสามารถดีบักได้หาก postgresql กำลังเรียกใช้ฟังก์ชันทุกครั้งที่เราเรียกใช้มุมมอง)
CREATE OR REPLACE FUNCTION something() RETURNS integer
AS 'select 1 from pg_sleep(5);'
LANGUAGE SQL
IMMUTABLE
RETURNS NULL ON NULL INPUT; --this function will delay 5 seconds
create view view1 as select * from something();
revoke all on function something() from user1;
grant select on view1 to user1;
เข้าสู่ระบบในฐานะผู้ใช้ 1:
select * from something(); (permission denied for something)
select * from view1 (permission denied for something )
การอนุญาตให้เลือกในมุมมองไม่แทนที่สิทธิ์การใช้งานและแม้แต่ที่แย่ที่สุดถ้าเราเพิกถอนการอนุญาตจาก view1 ข้อความยังคงแสดงให้เห็นว่า postgresql หยุดการสืบค้นเนื่องจากฟังก์ชั่นไม่ว่าจะได้รับอนุญาตจากมุมมองใด .. (นั่นคือสิ่งที่เกิดขึ้นในคำถาม)
แต่ฟังก์ชั่นการตรวจสอบเป็นครั้งแรกจริงๆ? หากเราให้สิทธิ์ 'all' แก่ฟังก์ชัน แต่เพิกถอนสิทธิ์การดู ...
grant all on function something to user1;
revoke all on view1 from user1;
select * from view1;
Delayed 5 seconds... (the function executed!)
Permission denied for select on view1
ตามที่คุณเห็น postgresql รอ 5 วินาที ก่อนจะบอกว่าเราไม่ได้รับอนุญาตให้แสดงมุมมองแสดงว่ามีการใช้งานฟังก์ชัน "something ()" ดังนั้นข้อมูลฟังก์ชันที่ส่งคืนจะต้องมีอยู่ก่อนการตรวจสอบมุมมอง
ตอนนี้ด้วยการทดสอบนี้เรารู้ว่า PostgreSQL จำเป็นต้องประเมินฟังก์ชั่นทั้งหมดก่อนที่จะดำเนินการสืบค้นต่อไปเช่นเดียวกับที่แบบสอบถามยังไม่มีอยู่จนกว่าฟังก์ชั่นทั้งหมดที่ envolved เสร็จสมบูรณ์ดังนั้นมุมมองจึงไม่สามารถแก้ไขสำหรับ postgresql ทราบว่าเรามีหรือไม่ได้รับอนุญาตให้เลือก
ฉันคิดว่านี่ตอบคำถามของคุณในแง่ของ "ลำดับการอนุญาต" แต่ทำไม postgresql จำเป็นต้องประเมินฟังก์ชั่นทั้งหมดก่อนดำเนินการต่อนั่นคือคำถามอื่น ...