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

Attiva SQL Trigger solo quando un particolare utente aggiorna la riga

Nelle recenti versioni di Postgres, c'è un when clausola che puoi usare per attivare condizionalmente il trigger. Potresti usarlo come:

... when (old.* is distinct from new.*) ...

Non sono al 100% questo funzionerà (non posso testare atm):

... when (current_user = 'foo') ...

(In caso contrario, prova a inserirlo in un blocco if nel tuo plpgsql.)

http://www.postgresql.org/docs/current/static /sql-createtrigger.html

(C'è anche l'aggiornamento [before|after] update of [col_name] sintassi, ma tendo a trovarlo meno utile perché si attiverà anche se il valore della colonna rimane lo stesso.)

Aggiungendo questa nota in più, visto che la risposta di @CraigRinger mette in evidenza cosa stai facendo...

Cercare di impostare la replica master-master tra Salesforce e Postgres utilizzando trigger condizionali è, credo, un sogno irrealizzabile. Dimenticalo... Ci sarà molto di più:dovrai bloccare i dati in modo appropriato su entrambe le estremità (cosa che non sarà necessariamente fattibile in modo ragionevole), gestire i deadlock risultanti (che potrebbe non essere rilevato automaticamente) e gestire dati in conflitto.

Le tue probabilità di riuscire con successo con una piccola squadra sono circa zero, specialmente se le tue abilità Postgres sono al livello in cui investire tempo nella lettura del manuale risponderebbe alle tue stesse domande. Puoi tranquillamente scommettere che qualcuno molto più competente in Salesforce o in un importante negozio di SQL (ad esempio quello per cui lavora Craig) ha considerato lo stesso e ha miseramente fallito o l'ha escluso.

Inoltre, sottolineo che l'implementazione di una replica multi-master efficiente, sincrona non un problema risolto. Hai letto bene:non risolto. Solo pochi anni fa, facendolo per niente non era abbastanza ben risolto per farcela nel core di Postgres. Quindi non hai immagini precedenti che funzionino bene su cui basare il tuo lavoro e su cui ripetere.