sql >> Base de Datos >  >> RDS >> PostgreSQL

Permitir la inserción solo desde dentro de un disparador

Sí, totalmente posible.

1. Generalmente deshabilitar UPDATE a A

Operaría con privilegios:

REVOKE ALL ON TABLE A FROM public;  -- and from anybody else who might have it

Eso deja a los superusuarios como postgres que ignoran estas humildes restricciones. Atraparlos dentro de su función de activación en A con pg_has_role() :

IF pg_has_role('postgres', 'member') THEN
   RETURN NULL;
END IF;

Donde postgres es un superusuario real. Nota:esto también afecta a otros superusuarios, ya que son miembros de todos los roles, incluso otros superusuarios.

Podría atrapar a los no superusuarios de una manera similar (alternativa a REVOKE enfoque).

2. Permitir UPDATE para el rol de demonio

Cree un rol de no inicio de sesión, que puede actualizar 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;

Crear funciones de activación en las tablas B y C , propiedad por este rol de daemon y con SECURITY DEFINER . Detalles:

Agregar a la función de activación en A :

IF pg_has_role('postgres', 'member') THEN
   RETURN NULL;
ELSIF pg_has_role('a_update', 'member') THEN
   RETURN NEW;
END IF;

Para dependencias simples 1:1, también puede trabajar con restricciones de clave externa (adicionalmente) usando ON UPDATE CASCADE .