Ja, fuldt ud muligt.
1. Tillad generelt OPDATERING
til A
Jeg ville operere med privilegier:
REVOKE ALL ON TABLE A FROM public; -- and from anybody else who might have it
Det efterlader superbrugere såsom postgres
som ignorerer disse ringe restriktioner. Fang dem i din trigger-funktion på A
med pg_has_role()
:
IF pg_has_role('postgres', 'member') THEN
RETURN NULL;
END IF;
Hvor postgres
er en egentlig superbruger. Bemærk:dette fanger også andre superbrugere, da de er medlemmer af enhver rolle, også andre superbrugere.
Du kan fange ikke-superbrugere på en lignende måde (alternativ til REVOKE
tilgang).
2. Tillad OPDATERING
til dæmonrolle
Opret en ikke-login-rolle, som har tilladelse til at opdatere A
:
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;
Opret triggerfunktioner på tabellerne B
og C
, ejet af denne dæmonrolle og med SIKKERHEDSDEFINER
. Detaljer:
Tilføj til triggerfunktionen på A
:
IF pg_has_role('postgres', 'member') THEN
RETURN NULL;
ELSIF pg_has_role('a_update', 'member') THEN
RETURN NEW;
END IF;
For simple 1:1 afhængigheder kan du også arbejde med fremmednøglebegrænsninger (yderligere) ved hjælp af ON UPDATE CASCADE
.