sql >> Databasteknik >  >> RDS >> PostgreSQL

Att skapa en utlösare för infogning av underordnade tabeller returnerar ett förvirrande fel

Din lösning fixar överföringen av den radtypade NEW variabel. Men du har ett lömskt SQL-injektionshål i din kod, det är särskilt farligt i en SECURITY DEFINER fungera. Användarinmatning får aldrig konverteras till SQL-kod unescaped.

Rensa så här:

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;

Även:

  • OLD är inte definierad i en INSERT utlösare.
  • Du behöver ingen variabel. Uppdrag är jämförelsevis dyra i plpgsql.


  1. Undvikande enstaka citat i PHP när du infogar i MySQL

  2. Hur man hittar en användares standardspråk i SQL Server (T-SQL)

  3. PostgreSQL VALUES Kommando förklaras

  4. Hur utför jag en infogning och returnerar insatt identitet med Dapper?