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
.