PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

C'è un modo per disabilitare gli aggiornamenti/eliminazioni ma consentire comunque ai trigger di eseguirli?

Sì, questo è possibile.

I trigger vengono eseguiti con i privilegi della funzione trigger, per impostazione predefinita SECURITY INVOKER il che significa che la funzione trigger viene effettivamente eseguita con i privilegi di current_user , nel tuo caso quello che inserisce le righe.

Se l'utente corrente non dispone dei privilegi richiesti per le tabelle su cui opera la funzione di attivazione, l'operazione originale nella tabella sottostante risulterà in errore.

Tuttavia , puoi utilizzare SECURITY DEFINER per la funzione trigger per eseguire questa funzione con i privilegi del OWNER della funzione.

Se hai un superutente proprio la funzione trigger, può fare tutto - che sarebbe un possibile pericolo per la sicurezza. Considera le istruzioni nel manuale sulla scrittura di SECURITY DEFINER Funziona in modo sicuro.

Ma è più saggio creare un ruolo semplice con solo i privilegi necessari OWNER della funzione di innesco. Puoi anche creare un ruolo "daemon" senza login, fungendo da pacchetto di privilegi per tali operazioni. Dovresti quindi concedere solo i privilegi necessari (su schemi, tabelle, sequenze ...) a questo ruolo daemon. Per progetti più sofisticati dovresti raggruppare i privilegi in "ruoli di gruppo" (di nuovo, nessun accesso) e concedere questi ruoli di gruppo ai ruoli che ne hanno bisogno (al ruolo demone in questo esempio), rendendoli effettivamente "membri del gruppo". Lo faccio spesso.

Considera questa risposta correlata su dba.SE riguardante i privilegi sulla funzione stessa:

  • Quali sono i privilegi richiesti per eseguire una funzione trigger in PostgreSQL 8.4?