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
.