sql >> Databasteknik >  >> RDS >> PostgreSQL

Finns det något sätt att inaktivera uppdateringar/borttagningar men ändå tillåta triggers att utföra dem?

Ja, detta är möjligt.

Triggers körs med privilegierna för triggerfunktionen, som standard är SECURITY INVOKER vilket innebär att triggerfunktionen exekveras effektivt med privilegierna för current_user , i ditt fall den som infogar rader.

Om den aktuella användaren inte har de nödvändiga rättigheterna för de tabeller som din triggerfunktion fungerar på, kommer din ursprungliga operation i den underliggande tabellen att felas.

Men , kan du använda SECURITY DEFINER för att triggerfunktionen ska köra denna funktion med privilegierna för OWNER av funktionen.

Om du har en egen superanvändare triggerfunktionen kan den göra allt - vilket skulle vara en möjlig säkerhetsrisk. Tänk på instruktionerna i manualen om hur du skriver SECURITY DEFINER Fungerar säkert.

Men det är klokare att skapa en vanlig roll med bara de nödvändiga privilegierna OWNER av triggerfunktionen. Du kan till och med bara skapa en "demon"-roll utan inloggning, som fungerar som privilegiepaket för sådana operationer. Du skulle då bara ge de nödvändiga privilegierna (på scheman, tabeller, sekvenser ...) till denna demonroll. För mer sofistikerade design bör du bunta privilegier i "grupproller" (igen, ingen inloggning) och ge dessa grupproller till roller som behöver det (till demonrollen i det här exemplet), vilket i praktiken gör dem till "medlemmar i gruppen". Jag gör det mycket.

Tänk på det här relaterade svaret på dba.SE angående privilegierna på själva funktionen:

  • Vilka privilegier krävs för att köra en triggerfunktion i PostgreSQL 8.4?



  1. Hur väljer man id med max datumgrupp efter kategori i PostgreSQL?

  2. Hur kan SQL Workload Analysis hjälpa dig?

  3. orakel | radera dubbletter av poster

  4. Intermittenta ODBC-anslutningsfel