PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Разрешете вмъкване само от тригер

Да, напълно възможно.

1. Като цяло забранете АКТУАЛИЗАЦИЯ към A

Бих работил с привилегии:

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

Това оставя суперпотребители като postgres които пренебрегват тези долни ограничения. Хванете тези във вашата тригерна функция на A с pg_has_role() :

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

Където е postgres е действителен суперпотребител. Забележка:това улавя и други суперпотребители, тъй като те са членове на всяка роля, дори на други суперпотребители.

Бихте могли да хванете не-суперпотребители по подобен начин (алтернатива на REVOKE подход).

2. Разрешете АКТУАЛИЗАЦИЯ за роля на демон

Създайте роля без влизане, която има право да актуализира 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;

Създайте тригерни функции на таблици B и C , собственост от тази роля на демон и с SECURITY DEFINER . Подробности:

Добавете към функцията за задействане на A :

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

За прости зависимости 1:1 можете също да работите с ограничения на чужд ключ (допълнително) с помощта на ON UPDATE CASCADE .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Дублирана колона след превключване от сериен към тип данни за идентичност в PostgreSQL / pgAdmin4

  2. django test app error - Получих грешка при създаването на тестовата база данни:разрешението е отказано за създаване на база данни

  3. PostgreSQL:.psql_history към /dev/null

  4. Изпълнение на PostgreSQL само в паметта

  5. Rails:PG::UndefinedTable:ГРЕШКА:релация ... не съществува