Bu durumda sorun tam olarak izin sırası değil, yürütme sırası ile ilgilidir.
Özgeçmişte, PostgreSQL için:
1- Tablolara erişen görünümler tablo iznini geçersiz kılar
2- Görünümlere erişim fonksiyonları, kontrol edilmeden önce tüm işlevleri değerlendirmelidir - bu nedenle görünümün erişim izinleri olmasa bile görünümün erişimine başlamadan önce işlevlerin yürütülmesi gerekir ...
Bunu nasıl ispatlayabiliriz?
Postgresql dosyasında, kullanıcı bu izinlere sahip olmasa bile görünümler size tabloda bir seçim yapma izni verebilir.
Örneğin:
create view view2 as select * from table1;
revoke all on table1 from user1;
grant select on view2 to user1;
Kullanıcı 1 olarak oturum açın:
select * from table1 (permission denied)
select * from view2 (sucess - the query executes)
Bu durumda, kullanıcı tablo seçme izniniz olmasa bile view2 öğesini seçebilir.
Ama ya aynı şeyi bir işlevle yaparsak ? Davranış aynı DEĞİLDİR . 1 döndürmeden önce 5 saniye bekleyecek bir işlev oluşturalım (böylece postgresql işlevi her çağırdığımızda işlevi çalıştırıyorsa hata ayıklayabiliriz)
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;
Kullanıcı 1 olarak oturum açın:
select * from something(); (permission denied for something)
select * from view1 (permission denied for something )
Görünümde seçme izni, işlev iznini geçersiz kılmaz ve hatta görünüm1'den izinleri iptal edersek bile, ileti, görünümün izni ne olursa olsun, postgresql'in işlev nedeniyle sorgumuzu durdurduğunu gösterir. (soruda olan tam olarak budur)
Ama önce işlev gerçekten kontrol ediliyor mu? Bu işleve 'tümü' izinleri verirsek, ancak görünüm iznini iptal edersek ...
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
Gördüğünüz gibi , "bir şey ()" işlevinin yürütüldüğünü göstererek görünüm çıktısı alma iznimiz olmadığını söylemeden önce 5 saniye bekledi . Bu nedenle, işlev verisi dönüşü, görünüm kontrolünden önce mevcut olmalıdır.
Şimdi bu testlerle, şimdi, sorguya devam etmeden önce tüm fonksiyonları değerlendirmek için gereken PostgreSQL'in, işlenen tüm fonksiyonlar tamamen tamamlanana kadar sorgunun hala mevcut olmadığı gibi olduğunu biliyoruz, bu nedenle görünüm postgresql için çözülemez. bunu seçmek için iznimiz olup olmadığını bilmek.
Sanırım bu sorunuzu "izin sırası" açısından cevaplıyor, ancak postgresql'nin devam etmeden önce neden tüm fonksiyonları değerlendirmesi gerekiyor, bu başka bir soru ...