2013-07-26 92 views
6

Fondamentalmente, voglio essere in grado di utilizzare il comando REVOKE per disabilitare UPDATE e DELETE, ma voglio ancora che i trigger su una tabella aggiornino le mie righe.C'è un modo per disabilitare gli aggiornamenti/eliminazioni, ma consentire comunque ai trigger di eseguirli?

I miei trigger si eseguono sulle righe appena inserite e aggiornano un campo specifico. Quindi voglio ancora questo comportamento, ma non sarebbero disabilitati con REVOKE o con un RULE. (I saw an SO post)

C'è un modo per continuare a utilizzare i comandi UPDATE/INSERT in TRIGGERS ma disabilitando il resto?

+0

Se il trigger aggiorna le righe, che vengono inserite, è un segno di progettazione errata. Puoi mostrare come alcuni dei tuoi trigger o dire, cosa fai con loro? –

+0

Se è necessario aggiornare un campo specifico di un record inserito, è sufficiente assegnare il valore desiderato a "NUOVO.specifico". Non hai bisogno di un aggiornamento separato. –

+0

Non l'ho progettato, ma non so se avrei fatto qualcosa di meglio per essere onesto. Non ho ancora guardato i trigger. Forse potrei usare questo, non lo so. Ti farò sapere. Grazie – Paco

risposta

11

Sì, questo è possibile.

I trigger vengono eseguiti con i privilegi della funzione di trigger, per impostazione predefinita su SECURITY INVOKER che significa che la funzione di trigger viene effettivamente eseguita con i privilegi di current_user, nel caso in cui si inseriscono le righe.

Se l'utente corrente non dispone dei privilegi necessari per le tabelle su cui è attiva la funzione di trigger, l'operazione originale nella tabella sottostante verrà ignorata.

Tuttavia, è possibile utilizzare SECURITY DEFINER per la funzione trigger di avere questa funzione di corsa con i privilegi del OWNER della funzione.

Se si dispone di un superuser propria la funzione trigger, può fare tutto ciò - che sarebbe un possibile rischio di sicurezza. Considera le istruzioni nel manuale su Writing SECURITY DEFINER Functions Safely.

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

Considerare anche this related question on dba.SE in merito ai privilegi sulla funzione stessa.

+0

Grazie, sembra davvero buono. La spiegazione che hai fornito è grandiosa. Dovrò controllarlo quando avrò una possibilità. Grazie ancora :) – Paco