powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Двойной update, bug?
25 сообщений из 61, страница 1 из 3
Двойной update, bug?
    #38575453
rashid.abzalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DDL:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
create table t(
  id bigint primary key, 
  f1 varchar(100), 
  f2 varchar(100)
);

create procedure p (
  id bigint) 
returns (
  Result varchar(100)
)
as
begin
  update t 
     set f2 = 'value updated by function' 
   where id = :id;
  Result = 'value from function';
  suspend;
end;

insert into t(id, f1, f2) values (1, 'old f1', 'old f2');


Двойной update:
Код: sql
1.
2.
3.
update t 
   set f1 = (select Result from p(1)) 
 where id = 1;


Запрос:
Код: sql
1.
select f1, f2 from t;


Результат:
idf1f21value from functionold f2

Как же так?
...
Рейтинг: 0 / 0
Двойной update, bug?
    #38575456
rashid.abzalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Забыл указать: Server Version: WI-V2.5.2.26540 Firebird 2.5
...
Рейтинг: 0 / 0
Двойной update, bug?
    #38575460
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rashid.abzalovКак же так?А как ты хотел ?
...
Рейтинг: 0 / 0
Двойной update, bug?
    #38575465
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rashid.abzalov,

а вот нефиг в селективных процедурах update делать, если это конечно не GTT
...
Рейтинг: 0 / 0
Двойной update, bug?
    #38575469
rashid.abzalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hvlad,

idf1f21value from function value updated by function

Чтобы сохранились результаты 2-х последовательных update независимых полей.
...
Рейтинг: 0 / 0
Двойной update, bug?
    #38575483
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rashid.abzalovЧтобы сохранились результаты 2-х последовательных updateА где тут два последовательных update ?

Далее - запись или обновляется вся, или не обновляется (тоже вся). Нет никаких "update независимых полей".

PS Последовательные операции - это такие операции, у которых не пересекаются моменты начала и окончания.
...
Рейтинг: 0 / 0
Двойной update, bug?
    #38575485
rashid.abzalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис,
автора вот нефиг в селективных процедурах update делать, если это конечно не GTT
Нет, не GTT и транзакция пишущая.

А почему нельзя? Например процедура, что-то изменила и сообщила об этом.
...
Рейтинг: 0 / 0
Двойной update, bug?
    #38575494
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rashid.abzalovНапример процедура, что-то изменила и сообщила об этом.

Для этого процедуру не обязательно делать селективной. Ты ещё не на такие баги напорешься если будешь так делать. В курсе про не стабильность курсора?

Если хочешь в каком-то поле зафиксировать тот факт что таблица была изменена это можно сделать с помощью триггеров.
...
Рейтинг: 0 / 0
Двойной update, bug?
    #38575496
pizmon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot hvlad]rashid.abzalovА где тут два последовательных update ?

да хоть бы и непоследовательных. типа update (в процедуре) прошел, ошибок никто не получил, а результата-то его -ап!, и нету.

"Нехорошо, Шурик" (с).
...
Рейтинг: 0 / 0
Двойной update, bug?
    #38575499
rashid.abzalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hvlad,
авторА где тут два последовательных update ?
Ну, хорошо, не последовательных, а вложенных.

авторДалее - запись или обновляется вся, или не обновляется (тоже вся). Нет никаких "update независимых полей".
То, что сейчас это работает так, это понятно? Но правильно ли это?
...
Рейтинг: 0 / 0
Двойной update, bug?
    #38575577
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rashid.abzalovТо, что сейчас это работает так, это понятно? Но правильно ли это?Я с радостью приму ссылку на стандарт, где описано это поведение.
Сам искать не буду - нет ни времени, ни желания.

Функции с побочными эффектами - это бардак. В любом ЯП.
Обычно в первый год обучения (практического, а не теоритического) это проходит :)
...
Рейтинг: 0 / 0
Двойной update, bug?
    #38575579
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pizmon,

не надо меня провоцировать
...
Рейтинг: 0 / 0
Двойной update, bug?
    #38575582
pizmon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladpizmon,

не надо меня провоцировать

Я пошутил, не обижайся.

по сути - все понятно, спасибо.
...
Рейтинг: 0 / 0
Двойной update, bug?
    #38575627
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pizmon,

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

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
create procedure p (
  id bigint) 
returns (
  Result varchar(100)
)
as
begin
  delete from t  
  where id = :id;
  Result = 'value from function';
  suspend;
end;



Код: sql
1.
2.
3.
update t 
   set f1 = (select Result from p(1)) 
 where id = 1;
...
Рейтинг: 0 / 0
Двойной update, bug?
    #38575641
pizmon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисpizmon,

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

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
create procedure p (
  id bigint) 
returns (
  Result varchar(100)
)
as
begin
  delete from t  
  where id = :id;
  Result = 'value from function';
  suspend;
end;



Код: sql
1.
2.
3.
update t 
   set f1 = (select Result from p(1)) 
 where id = 1;



Тебя-то можно провоцировать? Не сбежишь?

Тогда есть три варианта - delete в процедуре удаляет одну запись, update - no rows affected.
Второй вариант - exception при update (во внешнем контуре).
Третий вариант - exception в процедуре, типа попытки удалить залоченную запись.

Теперь ты о чем-нибудь подумай.
...
Рейтинг: 0 / 0
Двойной update, bug?
    #38575766
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pizmon,

даже думать не собираюсь. Просто привёл абсурдность таких действий
...
Рейтинг: 0 / 0
Двойной update, bug?
    #38575770
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pizmon,

не угадал результьтат
null null null
...
Рейтинг: 0 / 0
Двойной update, bug?
    #38575773
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

это для Fb3

для Fb2.5

The cursor identified in the UPDATE or DELETE statement is not positioned on a row.
no current record for fetch operation.
...
Рейтинг: 0 / 0
Двойной update, bug?
    #38575855
pizmon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисСимонов Денис,

для Fb2.5

The cursor identified in the UPDATE or DELETE statement is not positioned on a row.
no current record for fetch operation.

Таки шо мэшаеть сделать то же самое для конфликта update-update? Или хотя бы признать проблему?
Модератор: Давайте не будем заниматься наездами?
...
Рейтинг: 0 / 0
Двойной update, bug?
    #38575886
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Модератор: удалено
...
Рейтинг: 0 / 0
Двойной update, bug?
    #38575913
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rashid.abzalovА почему нельзя?Если не сделать fetch all резалтсета, то результаты могут быть самыми неожиданными.
Изменения в таблице лучше фиксировать триггерами.
...
Рейтинг: 0 / 0
Двойной update, bug?
    #38575932
pizmon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чорт, всё проспал! Надеюсь, под модераториалом скрывается та самая ссылка на стандарт, а не выступление по национальному вопросу.

Давайте, шановни друзи, вернемся к исходному вопросу.
Про триггера я действительно чуть было не забыл. А они говорят, что updatы таки действительно последовательные, зря мы эту позицию так легко сдали.

Можно слегонца модифицировать исходный DML:

Код: 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.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
create generator newid;

create table t(
  id bigint primary key, 
  f1 varchar(100), 
  f2 varchar(100) 
);

create table tr(
  id bigint,
  log varchar(100)
);

SET TERM ^ ;

CREATE TRIGGER tbu FOR T
ACTIVE BEFORE UPDATE POSITION 0
AS 
BEGIN 
  insert into tr(id, log) values (gen_id(newid, 1), 'before update: ' || new.f2 );  
END^

CREATE TRIGGER tau FOR T
ACTIVE after UPDATE POSITION 0
AS 
BEGIN 
  insert into tr(id, log) values (gen_id(newid, 1), 'after update: ' || new.f2 );  
END^


create procedure p (
  id bigint) 
returns (
  Result varchar(100)
)
as
begin
  update t 
     set f2 = 'value updated by function' 
   where id = :id;
   
 insert into tr(id, log) 
  select gen_id(newid, 1), 'after statement: ' || f2
   from t where id = :id; 

  Result = 'value from function';
  suspend;
end^


SET TERM ;^ 
commit;
insert into t(id, f1, f2) values (1, 'old f1', 'old f2');
update t 
   set f1 = (select Result from p(1)) 
 where id = 1;
select * from tr order by id;



И получить
Код: sql
1.
2.
3.
4.
5.
 1 before update: value updated by function
 2 after update: value updated by function
 3 after statement: value updated by function
 4 before update: old f2
 5 after update: old f2



Намек на то, что пока первый апдейт не закончился, второй - не начинается.
...
Рейтинг: 0 / 0
Двойной update, bug?
    #38575938
pizmon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladФункции с побочными эффектами - это бардак. В любом ЯП.

Всё есть яд, дружище, и всё есть лекарство - однако же в зависимости от дозы.
Мне вот кажется, что "прогоченный" оператор - это больший бардак, чем весь side-effect в мире, вместе взятый. Так что провоцировать надо, иначе не достучаться.

Мир?
...
Рейтинг: 0 / 0
Двойной update, bug?
    #38575974
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pizmon,

если тебе что-то кажется, а тебе говорят, что это не так, то это есть повод или самому разобраться - почему тебе так говорят, или спросить - а как же там оно на самом деле, или тупо троллить оппонента.
Ты пошёл последним путём - твой выбор.
...
Рейтинг: 0 / 0
Двойной update, bug?
    #38575975
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2модератор - не перегибай с удалениями, ибо будет нечего удалять вскоре.

2all - я всего лишь спросил, не пошутил ли pizmon опять...
...
Рейтинг: 0 / 0
25 сообщений из 61, страница 1 из 3
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Двойной update, bug?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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