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

Utworzenie wyzwalacza do wstawiania tabeli podrzędnej zwraca mylący błąd

Twoje rozwiązanie naprawia przekazywanie wpisanego wiersza NEW zmienny. Masz jednak w swoim kodzie podstępną lukę we wstrzykiwaniu SQL, która jest szczególnie niebezpieczna w SECURITY DEFINER funkcjonować. Dane wprowadzane przez użytkownika muszą nigdy zostać przekonwertowane na kod SQL bez ucieczki.

Odkaż w ten sposób:

CREATE OR REPLACE FUNCTION trg_test_log()
  RETURNS trigger AS
$$
BEGIN
    EXECUTE 'INSERT INTO public.' || quote_ident('testlog_' || NEW.name)
         || ' SELECT ($1).*'
    USING NEW;

    RETURN NULL;
END
$$
LANGUAGE plpgsql SECURITY DEFINER;

Również:

  • OLD nie jest zdefiniowany w INSERT wyzwalacz.
  • Nie potrzebujesz zmiennej. Zadania są stosunkowo drogie w plpgsql.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jaki jest odpowiednik LITAGG (bazy danych Oracle) w PostgreSQL?

  2. PostgreSQL nie może rozpocząć/zakończyć transakcji w PL/pgSQL

  3. W jaki sposób Postgresql COPY TO STDIN with CSV wykonuje aktualizację w przypadku konfliktu?

  4. LIKE zapytanie dotyczące elementów płaskiej tablicy jsonb

  5. Obcinanie wszystkich tabel w bazie danych Postgres