sql >> Databáze >  >> RDS >> PostgreSQL

Povolit vkládání pouze ze spouštěče

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 .




  1. Je možné, aby dotaz PHP MYSQL ignoroval prázdnou proměnnou v klauzuli WHERE?

  2. Datetime stejný nebo větší než dnes v MySQL

  3. Chyba Mysql:Uživatel zadaný jako definující ('mysql.infoschema'@'localhost') neexistuje' při pokusu o výpis tabulkových prostorů

  4. Jak počítat data v Java MySQL