sql >> Databasteknik >  >> RDS >> PostgreSQL

Tillåt endast införande från en utlösare

Ja, fullt möjligt.

1. Tillåt i allmänhet UPPDATERING till A

Jag skulle arbeta med privilegier:

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

Det lämnar superanvändare som postgres som ignorerar dessa låga restriktioner. Fånga dem i din trigger-funktion på A med pg_has_role() :

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

Där postgres är en verklig superanvändare. Notera:detta fångar även andra superanvändare, eftersom de är medlemmar i alla roller, även andra superanvändare.

Du kan fånga icke-superanvändare på liknande sätt (alternativ till REVOKE tillvägagångssätt).

2. Tillåt UPPDATERING för demonroll

Skapa en roll som inte är inloggad, som tillåts uppdatera 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;

Skapa triggerfunktioner i tabellerna B och C , ägd av denna demonroll och med SÄKERHETSDEFINERARE . Detaljer:

Lägg till triggerfunktionen på A :

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

För enkla 1:1-beroenden kan du också arbeta med restriktioner för främmande nyckel (ytterligare) med ON UPDATE CASCADE .




  1. Varför anses det vara dålig praxis att använda markörer i SQL Server?

  2. Mysql Performance Query

  3. Avancerad failover med Post/pre Script Hooks

  4. Hur man genererar DDL-skript (Skapa) från SQL Server Management Studio (SSMS) - SQL Server / TSQL Tutorial Del 17