Ja, fullt möjligt.
1. Tillåt i allmänhet UPPDATERING till A
Jag skulle arbeta med privilegier:
REVOKE ALL ON TABLE A FROM public; -- and from anybody else who might have it
Det lämnar superanvändare som postgres som ignorerar dessa låga restriktioner. Fånga dem i din trigger-funktion på A med pg_has_role()
:
IF pg_has_role('postgres', 'member') THEN
RETURN NULL;
END IF;
Där postgres är en verklig superanvändare. Notera:detta fångar även andra superanvändare, eftersom de är medlemmar i alla roller, även andra superanvändare.
Du kan fånga icke-superanvändare på liknande sätt (alternativ till REVOKE tillvägagångssätt).
2. Tillåt UPPDATERING för demonroll
Skapa en roll som inte är inloggad, som tillåts uppdatera 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;
Skapa triggerfunktioner i tabellerna B och C , ägd av denna demonroll och med SÄKERHETSDEFINERARE . Detaljer:
Lägg till triggerfunktionen på A :
IF pg_has_role('postgres', 'member') THEN
RETURN NULL;
ELSIF pg_has_role('a_update', 'member') THEN
RETURN NEW;
END IF;
För enkla 1:1-beroenden kan du också arbeta med restriktioner för främmande nyckel (ytterligare) med ON UPDATE CASCADE
.