PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Zezwalaj na wstawianie tylko z poziomu wyzwalacza

Tak, całkowicie możliwe.

1. Generalnie nie zezwalaj na UPDATE do A

Działałbym z uprawnieniami:

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

Pozostają superużytkownicy, tacy jak postgres którzy ignorują te skromne ograniczenia. Złap te wewnątrz funkcji wyzwalacza na A z pg_has_role() :

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

Gdzie postgres jest prawdziwym superużytkownikiem. Uwaga:obejmuje to również innych superużytkowników, ponieważ są oni członkami każdej roli, nawet innych superużytkowników.

Możesz złapać użytkowników niebędących superużytkownikami w podobny sposób (alternatywa do REVOKE podejście).

2. Zezwól na AKTUALIZACJĘ dla roli demona

Utwórz rolę bez logowania, która może aktualizować 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;

Utwórz funkcje wyzwalacza w tabelach B i C , własność przez tę rolę demona i SECURITY DEFINER . Szczegóły:

Dodaj do funkcji wyzwalacza w A :

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

W przypadku prostych zależności 1:1 możesz również pracować z ograniczenia kluczy obcych (dodatkowo) przy użyciu 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. Odwoływanie się do zmiennych sesji (\set var='value') z PL/PGSQL

  2. Uzyskiwanie wyników między dwiema datami w PostgreSQL

  3. Jak utworzyć histogram w PostgreSQL

  4. Jak zaimportować moduły lub zainstalować rozszerzenia w Postgresie?

  5. postgreSQL.app :utwórz bazę danych