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

Есть у меня триггер который запускает проверку изменились ли данные строки, и при изменении функция обновляет поле строки time_change

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
...
IF tg_op = 'UPDATE' AND ful_table_name != 'front.rest' THEN

  -- Проверим изменилось ли что-то в строках
  IF ROW(NEW.*) IS DISTINCT FROM ROW(OLD.*) THEN
    -- Изменилось, меняем дату.
  ELSE
    -- Ничего не менялось, выходим.
    RETURN new;
  END IF;
 
END IF;
...



Все работало хорошо все были счастливы, до тех пор пока я не начал использовать тип данных hstore.

После этого начал получать ошибку

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
ServerDataRecipient::loadCheck : ошибка = ERROR:  operator does not exist: hstore = hstore
СТРОКА 1: SELECT  ROW( $1 .*) IS DISTINCT FROM ROW( $2 .*)
                              ^
ПОДСКАЗКА:  No operator matches the given name and argument type(s). You might need to add explicit type casts.
ЗАПРОС:  SELECT  ROW( $1 .*) IS DISTINCT FROM ROW( $2 .*)
КОНТЕКСТ:  PL/pgSQL function "return_time_change" line 15 at IF
QPSQL: Невозможно создать запрос


Есть идеи как побороть?
Скажу сразу, что на нескольких таблицах стоит триггер который вызывает одну и ту же функцию, так что перечислять поля строк не самый лучший вариант :)
...
Рейтинг: 0 / 0
Проверка изменений строки
    #38767771
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YP977Добрый день.

Есть у меня триггер который запускает проверку изменились ли данные строки, и при изменении функция обновляет поле строки time_change

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
...
IF tg_op = 'UPDATE' AND ful_table_name != 'front.rest' THEN

  -- Проверим изменилось ли что-то в строках
  IF ROW(NEW.*) IS DISTINCT FROM ROW(OLD.*) THEN
    -- Изменилось, меняем дату.
  ELSE
    -- Ничего не менялось, выходим.
    RETURN new;
  END IF;
 
END IF;
...



Все работало хорошо все были счастливы, до тех пор пока я не начал использовать тип данных hstore.

После этого начал получать ошибку

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
ServerDataRecipient::loadCheck : ошибка = ERROR:  operator does not exist: hstore = hstore
СТРОКА 1: SELECT  ROW( $1 .*) IS DISTINCT FROM ROW( $2 .*)
                              ^
ПОДСКАЗКА:  No operator matches the given name and argument type(s). You might need to add explicit type casts.
ЗАПРОС:  SELECT  ROW( $1 .*) IS DISTINCT FROM ROW( $2 .*)
КОНТЕКСТ:  PL/pgSQL function "return_time_change" line 15 at IF
QPSQL: Невозможно создать запрос


Есть идеи как побороть?
Скажу сразу, что на нескольких таблицах стоит триггер который вызывает одну и ту же функцию, так что перечислять поля строк не самый лучший вариант :)

у меня ощущение что вы с search_path что то накрутили у себя не то...
так как

=# select '1=>2'::hstore = '2=>3'::hstore;
?column?
----------
f

прекрасно работает
равно как и

=# select row(2, '1=>2'::hstore) is distinct from row(2, '1=>2'::hstore);
?column?
----------
f

PS: какая версия базы у вас и что говорит show search_path ?

--Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
Проверка изменений строки
    #38767834
YP977
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Bogukу меня ощущение что вы с search_path что то накрутили у себя не то...
так как

=# select '1=>2'::hstore = '2=>3'::hstore;
?column?
----------
f

прекрасно работает
равно как и

=# select row(2, '1=>2'::hstore) is distinct from row(2, '1=>2'::hstore);
?column?
----------
f

PS: какая версия базы у вас и что говорит show search_path ?

--Maxim Boguk
www.postgresql-consulting.ru

Вообще его не трогал

Код: sql
1.
2.
3.
4.
=> show search_path;
search_path
----------------
 "$user",public



Код: sql
1.
2.
3.
4.
=> select setting::int FROM pg_settings WHERE name = 'server_version_num';
 setting 
---------
   80421



Хотя используются версии и 9.1
...
Рейтинг: 0 / 0
Проверка изменений строки
    #38767847
YP977
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проверил у себя

Код: sql
1.
2.
3.
4.
5.
=> select '1=>2'::hstore = '2=>3'::hstore;
ERROR:  operator does not exist: hstore = hstore
СТРОКА 1: select '1=>2'::hstore = '2=>3'::hstore;
                                ^
ПОДСКАЗКА:  No operator matches the given name and argument type(s). You might need to add explicit type casts.


Код: sql
1.
2.
3.
4.
5.
=> select row(2, '1=>2'::hstore) is distinct from row(2, '1=>2'::hstore);
ERROR:  operator does not exist: hstore = hstore
СТРОКА 1: select row(2, '1=>2'::hstore) is distinct from row(2, '1=>2'...
                                        ^
ПОДСКАЗКА:  No operator matches the given name and argument type(s). You might need to add explicit type casts.
...
Рейтинг: 0 / 0
Проверка изменений строки
    #38767874
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YP977,

значит на 8.4 не работает...
проверьте я думаю на 9.1 должно работать


что делать c 8.4 - закопать стюардессу :)

--Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
Проверка изменений строки
    #38767954
YP977
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Boguk,

Подтверждаю, на 9.1 действительно работает...

Стюардессу, видимо, действительно пора закопать. :)

Спасибо.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Проверка изменений строки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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