LINUX.ORG.RU

postgres. триггер


0

0

день добрый.

есть желание устроить перебор всех столбцов таблицы в цикле, дабы не завязываться на их количество. есть переменная NEW — то, что будет вставлено после завершения транзакции.

подобный код:
declare
var1 text;
var2 text;
begin
for var1 in select column_name from information_schema.columns where table_name =TG_RELNAME loop
var2:=select NEW.var1.column.name;
end;

приводит к ошибке. говорит, что NEW — это record, а не rule.

при попытке изменить на нечто подобное:
var3:=var1.column.name;
var2:=select NEW.var3;


возникает ошибка "нет колонки с именем var3"

попытка обозначить приоритеты через скобки:
var3:=var1.column.name;
var2:=select NEW.(var3);

возвращает просто синтаксическую ошибку вида:
var2:=select $1.($2);

может кто сталкивался? как воевать?

насколько я знаю в языке plpgsql нет способа обратиться динамически к полю, тобишь то что справа от NEW. должно быть известно при компиляции функции и не должно изменяться. напиши тригер на любом другом языке в котором NEW передаётся в виде массива этого языка. например perl:

Eshkin_kot ★★
()

вот пример, как сделать цикл по хешмассиву $_TD->{new} думаю разберёшься сам :)

begin;

CREATE OR REPLACE FUNCTION trim_field_both() RETURNS "trigger"
AS $$
	if ($_TD->{argc} != 1) {
		elog(ERROR, "Trigger trim_field_both MUST be created with param: field_name");
	}
	my $fld_name = $_TD->{args}->[0];
	my $val = $_TD->{new}{$fld_name};

	$val =~ s/^\s+//;
	$val =~ s/\s+$//;

	$_TD->{new}{$fld_name} = $val;

	return 'MODIFY';
$$
    LANGUAGE plperl;

create trigger trim_field_both_name
	before update or insert on addr_street
	for each row execute procedure trim_field_both('name');

commit;

Eshkin_kot ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.