powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Сравнение двух record
6 сообщений из 6, страница 1 из 1
Сравнение двух record
    #38651116
Подскажите как оптимально сравнить две записи типа record и получить разницу между ними, может быть есть какая то функция для этого? Не хочется в цикле все записи перебирать.

Задача у меня в триггере сравнить OLD и NEW, и сделать определённые операции по тем которые отличаются.

Сейчас я делаю что то вроде этого
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
        SELECT array_agg(column_name::character varying) INTO _columns
	FROM information_schema.columns 
	WHERE table_name=TG_TABLE_NAME AND table_schema=TG_TABLE_SCHEMA;

	FOR i IN array_lower(_columns,1) .. array_upper(_columns,1) LOOP
		_query='SELECT NEW.'||_columns[i]||' IS DISTINCT FROM OLD.'||_columns[i]||';';
		EXECUTE _query INTO _flag;
	END LOOP;



И получаю ошибку "ERROR: NEW used in query that is not in a rule"

Есть идеи? Заранее спасибо!
...
Рейтинг: 0 / 0
Сравнение двух record
    #38651149
ORA-12705
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей Светлицкий,

Может так?

Код: sql
1.
2.
3.
if (row(old.*) <> row(new.*)) then
    ...
end if;



Как это работает можно подглядеть например здесь: https://wiki.postgresql.org/wiki/Audit_trigger
...
Рейтинг: 0 / 0
Сравнение двух record
    #38651161
ORA-12705,

Мне нужно знать по каким полям отличаются записи
...
Рейтинг: 0 / 0
Сравнение двух record
    #38651170
V&N
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
V&N
Гость
Алексей Светлицкий,
9.21.5. Row-wise Comparison остальное по старинке ... конечно можно в json/hstore закатать ...
...
Рейтинг: 0 / 0
Сравнение двух record
    #38651233
какабычна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей СветлицкийORA-12705,

Мне нужно знать по каким полям отличаются записи
EXECUTE '... ' USING (NEW,OLD);
...
Рейтинг: 0 / 0
Сравнение двух record
    #38662255
Спасибо всем, USING действительно помог, сделал так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
        IF (TG_OP = 'DELETE') THEN
		EXECUTE 'SELECT add_log('||_id_log_subtype::character varying||',3,NULL);';
		RETURN NEW;
        ELSIF (TG_OP = 'UPDATE') THEN
		SELECT array_agg(column_name::character varying) INTO _columns
		FROM information_schema.columns 
		WHERE table_name=TG_TABLE_NAME AND table_schema=TG_TABLE_SCHEMA;
		FOR i IN array_lower(_columns,1) .. array_upper(_columns,1) LOOP
			EXECUTE 'SELECT $1.'||_columns[i]||' IS DISTINCT FROM $2.'||_columns[i]||';' USING NEW,OLD INTO _flag;
			IF _flag IS TRUE THEN
				_log_dat=array_append(_log_dat,('ARRAY['''||_columns[i]||''',$1.'||_columns[i]||'::character varying]')::character varying);
			END IF;
		END LOOP;
		IF _log_dat IS NOT NULL THEN
			_query=(SELECT 'ARRAY['||array_to_string(_log_dat,',')||']')::character varying;
			EXECUTE 'SELECT add_log('||_id_log_subtype::character varying||',2,'||_query||');' USING NEW;
		END IF;
		RETURN NEW;
        ELSIF (TG_OP = 'INSERT') THEN
		SELECT 'ARRAY['||array_to_string(array_agg('ARRAY['''||column_name::character varying||''',$1.'||column_name::character varying||'::character varying]'),',')||']' INTO _query
		FROM information_schema.columns 
		WHERE table_name=TG_TABLE_NAME AND table_schema=TG_TABLE_SCHEMA;
		EXECUTE 'SELECT add_log('||_id_log_subtype::character varying||',1,'||_query||');' USING NEW;
		RETURN NEW;
        END IF;
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Сравнение двух record
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]