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
.