Ano, zcela možné.
1. Obecně zakažte UPDATE na A
Pracoval bych s oprávněními:
REVOKE ALL ON TABLE A FROM public; -- and from anybody else who might have it
Zbývají superuživatelé jako postgres kteří ignorují tato nízká omezení. Chyťte je uvnitř vaší spouštěcí funkce na A s pg_has_role()
:
IF pg_has_role('postgres', 'member') THEN
RETURN NULL;
END IF;
Kde postgres je skutečným superuživatelem. Poznámka:Toto zachytí i ostatní superuživatele, protože jsou členy každé role, dokonce i ostatní superuživatele.
Podobným způsobem můžete chytit uživatele, kteří nejsou superuživateli (alternativa k REVOKE přístup).
2. Povolit UPDATE pro roli démona
Vytvořte roli bez přihlášení, která může aktualizovat 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;
Vytvořte spouštěcí funkce na tabulkách B a C , vlastněno pomocí této role démona a pomocí DEFINOVAČE BEZPEČNOSTI . Podrobnosti:
Přidejte do spouštěcí funkce na A :
IF pg_has_role('postgres', 'member') THEN
RETURN NULL;
ELSIF pg_has_role('a_update', 'member') THEN
RETURN NEW;
END IF;
Pro jednoduché závislosti 1:1 můžete také pracovat s omezení cizího klíče (dodatečně) pomocí ON UPDATE CASCADE
.