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
.