Tetikleyici işlevler, ayrıcalıklar açısından diğer işlevler gibi davranır. Küçük bir istisna dışında:
Bir tabloda tetikleyici oluşturmak için kullanıcının TRIGGER
tabloda ayrıcalık olması gerekir . Kullanıcının EXECUTE
tetikleme işlevi üzerinde de ayrıcalığı olmalıdır .
GÜNCELLEME
Yorumlardaki geri bildirimlerden sonra biraz araştırma yaptım. Bir yoktur Postgres Wiki açık YAPILACAK öğesi:
Tetikleyici izin kontrollerini sıkın
Bağlı Postgres hacker bu parçacığı . Şu anda, EXECUTE
bir tetikleyici işlevindeki ayrıcalıklar yalnızca tetikleyici oluşturma zamanında denetlenir , ancak çalışma zamanında denetlenmez . Bu nedenle, tetikleyici işlevi üzerinde EXECUTE işlevinin iptal edilmesinin, oluşturulduktan sonra tetikleyici üzerinde hiçbir etkisi yoktur. Gözleminiz doğru görünüyor.
Bu, nesneleri işlemek için herhangi bir ek ayrıcalık sağlamaz. Çağıran rolde, işlev gövdesini yürütmek (parçalarını yapmak) için gerekli ayrıcalıklar yoksa, olağan istisna ortaya çıkar. Yolu açmak için OWNER
, işlevin ayrıcalıklı bir kullanıcısını yapabilir ve
SECURITY DEFINER
fıkra, buradaki kılavuzda belirtildiği gibi . İşlevin invoker yerine sahibinin izinleriyle çalışmasına neden olur (varsayılan).
Sahibi bir süper kullanıcıysa, kime EXECUTE
ayrıcalık tanıdığınıza ve işlevin kötüye kullanımdan kaçınmak için neler yapabileceğine çok dikkat etmelisiniz . İsteyebilirsiniz
REVOKE ALL ON FUNCTION foo() FROM public;
SET search_path
işlev ile başlamak ve kullanmak için. Fonksiyonları Güvenli Yazma
bölümünü okuduğunuzdan emin olun .SECURITY DEFINER
SO ile ilgili bu cevapta bir kod örneği bulun .
SECURITY DEFINER
, istiyorumSECURITY INVOKER
. Ama öyle görünüyor ki (tetikleyici işlevi için, normal işlev için değil), varsayılan seçeneği (SECURITY INVOKER
) kullanarak böyle davranmaz.