sql >> Database >  >> RDS >> PostgreSQL

Alleen invoeging toestaan ​​vanuit een trigger

Ja, helemaal mogelijk.

1. Over het algemeen niet toestaan ​​UPDATE naar A

Ik zou werken met privileges:

REVOKE ALL ON TABLE A FROM public;  -- and from anybody else who might have it

Dat laat supergebruikers zoals postgres die deze lage beperkingen negeren. Vang die in je trigger-functie op A met pg_has_role() :

IF pg_has_role('postgres', 'member') THEN
   RETURN NULL;
END IF;

Waar postgres is een echte supergebruiker. Let op:dit treft ook andere superusers, aangezien ze lid zijn van elke rol, zelfs andere superusers.

Je zou niet-superusers op een vergelijkbare manier kunnen vangen (alternatief voor de REVOKE benadering).

2. Sta UPDATE toe voor daemon-rol

Maak een niet-inlogrol aan, die A . mag updaten :

CREATE ROLE a_update NOLOGIN;
-- GRANT USAGE ON SCHEMA xyz TO a_update;  -- may be needed, too
GRANT UPDATE ON TABLE A TO a_update;

Creëer triggerfuncties op tabellen B en C , eigendom door deze daemon-rol en met SECURITY DEFINER . Details:

Toevoegen aan de triggerfunctie op A :

IF pg_has_role('postgres', 'member') THEN
   RETURN NULL;
ELSIF pg_has_role('a_update', 'member') THEN
   RETURN NEW;
END IF;

Voor eenvoudige 1:1-afhankelijkheden kunt u ook werken met buitenlandse sleutelbeperkingen (aanvullend) met behulp van ON UPDATE CASCADE .




  1. Ophalen hoe lang het duurt om verbinding te maken met PHP mysqli_real_connect()

  2. Bestand uploaden Ajax PHP

  3. Hoe Galera Cluster of MySQL-replicatie te herstellen van het Split Brain Syndroom?

  4. Laravel:hoe voeg je waar-clausule toe met behulp van querybuilder?