функций постгреса (а не приложения, которое в него пишет)? например, хочу, чтобы некоторые строки триммились (trim()) или приводились к нижнему регистру (lower()). погуглил и изобрёл что-то такое:
create function apply_functions()
returns trigger as $$
declare
_col text := quote_ident(TG_ARGV[0]);
_old_val text;
_new_val text;
begin
execute format('select $1.%1$I, $1.%1$I', _col)
into _old_val, _new_val
using new;
for _i in 1..TG_NARGS loop
execute format('select %1$s(%2$L)', TG_ARGV[_i], _new_val)
into _new_val;
end loop;
if _old_val is distinct from _new_val then
new := new #= hstore(_col, _new_val);
end if;
return new;
end;
$$ language plpgsql;
а потом как-то так в виде триггера:
create trigger normalize_first_name
before insert or update of first_name on users
for each row
when (new.first_name is distinct from trim(new.first_name))
execute function apply_functions('first_name', 'trim');
create trigger normalize_email
before insert or update of email on users
for each row
when (new.email is distinct from trim(lower(new.email)))
execute function apply_functions('email', 'trim', 'lower');
выглядит, конечно, как будто я упоролся и просто неправильно готовлю постгрес ¯\_(ツ)_/¯
Я бы такую логику в приложение заселил.
Выглядит дикими костылями, да и сама работа со строками через execute не внушает доверия. Если на клиенте никак, можно сделать функцию nrmlz(in_text) и явно применять её к полям на входе. Там можно и трим, и регистр, и спецсимволы почистить... Но передавать туда напрямую данные от юзеров всё равно не стоит.
Если это приемлема сделайте вьюху с нормализацией Или по планировщику делайте нормализацию
Обсуждают сегодня