sql >> Database teknologi >  >> RDS >> PostgreSQL

Tillad kun indsættelse fra en trigger

Ja, fuldt ud muligt.

1. Tillad generelt OPDATERING til A

Jeg ville operere med privilegier:

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

Det efterlader superbrugere såsom postgres som ignorerer disse ringe restriktioner. Fang dem i din trigger-funktion på A med pg_has_role() :

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

Hvor postgres er en egentlig superbruger. Bemærk:dette fanger også andre superbrugere, da de er medlemmer af enhver rolle, også andre superbrugere.

Du kan fange ikke-superbrugere på en lignende måde (alternativ til REVOKE tilgang).

2. Tillad OPDATERING til dæmonrolle

Opret en ikke-login-rolle, som har tilladelse til at opdatere 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;

Opret triggerfunktioner på tabellerne B og C , ejet af denne dæmonrolle og med SIKKERHEDSDEFINER . Detaljer:

Tilføj til triggerfunktionen på A :

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

For simple 1:1 afhængigheder kan du også arbejde med fremmednøglebegrænsninger (yderligere) ved hjælp af ON UPDATE CASCADE .




  1. indstillingsflagværdibase på post findes i en anden tabel

  2. Lagret procedure med valgfri WHERE-parametre

  3. De dynamiske faner viser de samme poster

  4. Hvordan vælger du fra mysql, hvor sidste tegn i en streng =x?