sql >> Database teknologi >  >> RDS >> PostgreSQL

Postgresql:Hvordan undslipper man enkelte citater i databaseudløseren?

I almindelighed undgås citater ved at fordoble dem.

For at sætte dine variable sammen i en SQL-streng, skal du bruge quote_literal() - den funktion sørger for korrekt at undslippe enkelt citat, f.eks.:

quote_literal(temp_row.row_data)

Når det er sagt:den bedre (og sikrere) løsning er at bruge parametre kombineret med format() :

EXECUTE 
   format('INSERT INTO audit.%I_history values ($1, $2, $3)', tg_table_name)
   using temp_row.action_tstamp_tx, temp_row.action, temp_row.row_data; 

%I pladsholder sørger normalt for at escape en identifikator korrekt, selvom det i dette tilfælde ikke ville fungere. Hvis du vil være 100 % sikker på, at selv ikke-standardtabelnavne fungerer korrekt, skal du først indsætte måltabelnavnet i en variabel og bruge det til format() funktion:

l_tablename := TG_TABLE_NAME || '_history';
EXECUTE 
   format('INSERT INTO audit.%I_history values ($1, $2, $3)', l_tablename)
   using ....

Denne del:

v_sql = 'select * from ' || TG_TABLE_NAME::regclass || '_history';
execute v_sql into temp_row;

kommer også til at mislykkes efter første række. execute .. into ... forventer, at forespørgslen returnerer en enkelt . Den erklæring, du bruger, returnerer alle rækker fra historiktabellen.

Jeg forstår heller ikke, hvorfor du gør det i første omgang.

Du behøver slet ikke at vælge fra historiktabellen.

Noget som dette burde være nok (utestet! ):

IF (TG_OP = 'UPDATE' AND TG_LEVEL = 'ROW') THEN
    temp_row := OLD;
ELSIF (TG_OP = 'DELETE' AND TG_LEVEL = 'ROW') THEN
    temp_row := OLD;
ELSIF (TG_OP = 'INSERT' AND TG_LEVEL = 'ROW') THEN
    temp_row := NEW;
ELSE
    RAISE EXCEPTION '[audit.if_modified] - Trigger func added as trigger for unhandled case: %, %',TG_OP, TG_LEVEL;
    RETURN NULL;
END IF;

execute format ('insert ... values ($1, $2, $3') 
   using now(), SUBSTRING(TG_OP,1,1), temp_row;

Til sidst:der er skrevet revisionstriggere før, og der er en masse færdige løsninger til dette:




  1. Hvad er datatypen bytea, og hvornår vil jeg bruge den?

  2. Henter fil fra bytea i PostgreSQL ved hjælp af java

  3. Laravel Schema Builder:Oprettelse af en binær(16) kolonne

  4. Hvordan dropper man en tabel baseret på IF-tilstand i postgres?