Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Обновление записи по курсору / 7 сообщений из 7, страница 1 из 1
08.11.2019, 20:49
    #39886948
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление записи по курсору
Наткнулся на такое поведение Interbase.

Есть таблица с тремя полями
Код: sql
1.
2.
3.
4.
5.
CREATE TABLE TEST (
    ID     INTEGER NOT NULL,
    DATA1  INTEGER,
    DATA2  INTEGER
);



В таблице есть запись
Код: sql
1.
INSERT INTO test ("ID") VALUES (1);



И есть такая процедура
Код: sql
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.
26.
27.
CREATE PROCEDURE SP_TEST
AS
  DECLARE VARIABLE var_id INTEGER;
BEGIN
  FOR
    SELECT
      t."ID"
    FROM
      test t
    WHERE
      t."ID" = 1
    INTO
      :var_id
    AS CURSOR
      cur_tst
  DO BEGIN
    UPDATE test t SET
      t."DATA1" = 1
    WHERE
      t."ID" = :var_id;

    UPDATE test t SET
      t."DATA2" = 2
    WHERE
      CURRENT OF cur_tst;
  END
END

Т.е. вначале обновляется одно поле на основании ID, а затем другое поле на основании текущего курсора.

После выполнения процедуры получаю таблицу
IDDATA1DATA21NULL2
Как я понимаю, причина в том, что второй UPDATE или проигнорировал результаты первого UPDATE или обновил все поля на основании текущего курсора, несмотря на то, что было указано обновить только одно поле.

Если заменить последний UPDATE на такой
Код: sql
1.
2.
3.
4.
    UPDATE test t SET
      t."DATA2" = 2
    WHERE
      t."ID" = :var_id;

то получаем адекватную картину
IDDATA1DATA2112
Собственно вопрос, это баг Interbase или это адекватное поведение курсора?

С уважением, Vasilisk
...
Рейтинг: 0 / 0
08.11.2019, 21:10
    #39886953
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление записи по курсору
Причем если добавить такой логгирующий триггер
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE TRIGGER TR_TEST_BU0 FOR TEST
ACTIVE BEFORE UPDATE POSITION 0
AS
  DECLARE VARIABLE var_msg VARCHAR(256);
BEGIN
  var_msg =
    'Old.Data1: ' || COALESCE(OLD."DATA1", -1) ||
    ', New.Data1: ' || COALESCE(NEW."DATA1", -1) ||
    ', Old.Data2: ' || COALESCE(OLD."DATA2", -1) ||
    ', New.Data2: ' || COALESCE(NEW."DATA2", -1);
  INSERT INTO log (
    "MSG"
  ) VALUES (
    :var_msg
  );
END

То получается такая картина
IDMSG3Old.Data1: -1, New.Data1: 1, Old.Data2: -1, New.Data2: -14Old.Data1: -1, New.Data1: -1, Old.Data2: -1, New.Data2: 2Т.е. при втором UPDATE обновляется старая версия записи
...
Рейтинг: 0 / 0
08.11.2019, 22:04
    #39886963
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление записи по курсору
_Vasilisk_,

про это надо в техсаппорте ИБ спрашивать.
...
Рейтинг: 0 / 0
09.11.2019, 00:44
    #39886979
Старый плюшевый мишка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление записи по курсору
kdv
_Vasilisk_,

про это надо в техсаппорте ИБ спрашивать.


Зевая: и версию назвать когда спрашиваешь...
...
Рейтинг: 0 / 0
09.11.2019, 01:17
    #39886988
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление записи по курсору
_Vasilisk_это баг Interbase или это адекватное поведение курсора?

select for update изменит картину?

А так-то это, конечно, баг, причём, возможно, из старых, правившихся ещё в FB 1.0-1.5.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
11.11.2019, 17:16
    #39887608
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление записи по курсору
Dimitry Sibiryakov
select for update изменит картину?
Нет
Dimitry Sibiryakov
А так-то это, конечно, баг,
Спасибо. Думал, что я чего-то не понимаю в версионности записей
Старый плюшевый мишка
и версию назвать когда спрашиваешь...
А смысл? Меня интересует только это нормальное поведение или нет.
...
Рейтинг: 0 / 0
11.11.2019, 17:18
    #39887610
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление записи по курсору
11.11.2019 17:16, _Vasilisk_ пишет:
>
> А смысл? Меня интересует только это нормальное поведение или нет.

проверь на FB и сделай выводы.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Обновление записи по курсору / 7 сообщений из 7, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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