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:
- http://okbob.blogspot. de/2015/01/most-simply-implementation-of-history.html
- https://github.com/wingspan/wingspan-auditing
- https://www.cybertec-postgresql.com /en/tracking-changes-in-postgresql/
- https://wiki.postgresql.org/wiki/Audit_trigger_91plus