sql >> Databáze >  >> RDS >> PostgreSQL

Jak uložit data s proměnlivým znakem čárky, která procházejí spouštěčem?

Můžete použít format() aby bylo vytváření dynamického SQL dotazu mnohem snazší, protože bude automaticky správně pracovat s identifikátory a literály. Jedna věc, kterou lidé obvykle přehlížejí, je, že pomocí (...).* můžete rozšířit jeden výraz záznamu do všech jeho sloupců - to také funguje pro NEW a OLD zaznamenat proměnné ve spouštěči, např. select (new).*

Proměnné můžete také předat dynamickému SQL pomocí using klíčové slovo execute tvrzení. Není potřeba převádět záznam tam a zpět mezi záznamem a textovou reprezentací.

Pomocí této možnosti lze vaši spouštěcí funkci zjednodušit na:

DECLARE 
  l_sql text;
BEGIN
    IF TG_TABLE_SCHEMA = 'public' THEN
      newtable := TG_TABLE_NAME || '_actividad';
    ELSE
      newtable := TG_TABLE_SCHEMA || '_' || TG_TABLE_NAME || '_actividad';
    END IF;

    PERFORM creartablaactividad(TG_TABLE_SCHEMA, TG_TABLE_NAME);
    l_sql := 'INSERT INTO actividad.%I  SELECT current_user, current_timestamp, %L, ($1).*';

    IF TG_OP = 'DELETE' THEN
      execute format(l_sql, newtable, 'D') using OLD;
      RETURN OLD;
    ELSE
      -- covers UPDATE and INSERT
      execute format(l_sql, newtable, 'U') using NEW;
      RETURN NEW;
    END IF;

    RETURN NULL; -- result is ignored since this is an AFTER trigger
END;

Použití zástupných symbolů jako %I a %L také umožňuje definovat skutečný SQL pouze jednou a znovu jej použít. Tyto "parametry" jsou nahrazeny format() funkce (která zachovává $1 )

Všimněte si použití ($1).* uvnitř řetězce SQL. Tím se execute příkaz rozbalte parametr záznamu $1 do všech jeho sloupců. Samotný záznam je předán "nativní" pomocí USING klíčové slovo.

Použití INSERT bez seznamu cílových sloupců (insert into some_table ... místo insert into some_table (col1, col2, ...) ... ) je docela křehká věc. Pokud se zdroj a cíl neshodují, vložka může docela snadno selhat. .

Pokud neprovádíte masivní vytváření sestav o tabulkách auditu (kde by bylo použití explicitních názvů sloupců mnohem efektivnější), možná budete chtít vymyslet obecnější spouštěč auditu pomocí JSON nebo HSTORE sloupec pro uložení celého záznamu. K dispozici je několik hotových spouštěčů auditu:




  1. PHP a MySQL:Seřaďte podle nejnovějšího data a limitu 10

  2. Mysql Vyberte druhý řádek

  3. Halloweenský problém – část 4

  4. init skripty mySQL neběží s docker-compose