SQLRU.net
Разработка приложений баз данных

Начало » Использование СУБД » Firebird, HQbird, InterBase » FB 4.0 DML в execute statement и автономные транзакции (Странные баги.)
FB 4.0 DML в execute statement и автономные транзакции [сообщение #2556] Wed, 14 June 2023 16:21 Переход к следующему сообщению
protector в настоящее время не в онлайне  protector
Сообщений: 7
Зарегистрирован: May 2023
Junior Member

Обнаружил, что в четверке поломалась работа с DML в execute statement в автономных транзакциях. В 2.5 и 3.0 всё работает.
Вот простейший пример.

CREATE TABLE NEW_TABLE (
    F1  INTEGER,
    F2  INTEGER
);

SET TERM ^ ;

CREATE OR ALTER TRIGGER NEW_TABLE_AIUD0 FOR NEW_TABLE
ACTIVE AFTER INSERT OR UPDATE OR DELETE POSITION 0
as
begin

end
^

execute block
returns(ID int)
as
begin
  in autonomous transaction do
    execute statement 'drop trigger NEW_TABLE_AIUD0';

  suspend; --different errors

  execute statement 'alter table NEW_TABLE alter F2 position 1';
end
^
в результате получаем ошибку, причём разную с suspend и без него.

/* without suspend;

Undefined name.
unsuccessful metadata update.
ALTER TABLE NEW_TABLE failed.
SQL error code = -204.
Table unknown.
NEW_TABLE.
<Missing arg #1 - possibly status vector overflow>.
---------------------------------------------------
SQLCODE: -204
SQLSTATE: 42S02
GDSCODE: 335544351*/


/* with suspend;

This operation is not defined for system tables.
unsuccessful metadata update.
ALTER TABLE NEW_TABLE failed.
deadlock.
update conflicts with concurrent update.
concurrent transaction number is 215649.
At block line: 10, col: 3.*/
Ошибка происходит на строке с алтером. Причём, походу, дело касается только тригеров, и в алтере должен быть "alter position", иначе всё работает!
Re: FB 4.0 DML в execute statement и автономные транзакции [сообщение #2557 является ответом на сообщение #2556] Wed, 14 June 2023 18:14 Переход к предыдущему сообщениюПереход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 332
Зарегистрирован: June 2022
Senior Member
Autoddl включен? И второй вопрос зачем так старательно ходить граблям?
Re: FB 4.0 DML в execute statement и автономные транзакции [сообщение #2561 является ответом на сообщение #2557] Wed, 14 June 2023 21:01 Переход к предыдущему сообщениюПереход к следующему сообщению
protector в настоящее время не в онлайне  protector
Сообщений: 7
Зарегистрирован: May 2023
Junior Member

Цитата:
Autoddl включен? И второй вопрос зачем так старательно ходить граблям?
AutoDDL тут не причём. Execute Block этот можно выполнить откуда угодно. Этот скрипт просто воспроизводимый пример. И граблей тут нет никаких. Где ты вообще грабли видишь?
Re: FB 4.0 DML в execute statement и автономные транзакции [сообщение #2562 является ответом на сообщение #2561] Thu, 15 June 2023 00:57 Переход к предыдущему сообщениюПереход к следующему сообщению
SD в настоящее время в онлайне  SD
Сообщений: 416
Зарегистрирован: August 2022
Senior Member
DDL в параллельных транзакциях это всегда грабли и никогда толком не работало.
Поэтому rule of dumb: любые модификации метаданных базы проводятся строго в монопольном режиме.
Re: FB 4.0 DML в execute statement и автономные транзакции [сообщение #2563 является ответом на сообщение #2562] Thu, 15 June 2023 12:04 Переход к предыдущему сообщению
protector в настоящее время не в онлайне  protector
Сообщений: 7
Зарегистрирован: May 2023
Junior Member

SD писал(а) Thu, 15 June 2023 00:57
DDL в параллельных транзакциях это всегда грабли и никогда толком не работало.
Поэтому rule of dumb: любые модификации метаданных базы проводятся строго в монопольном режиме.
Говорю, что это вырожденный пример. Странно то, что баг связан ТОЛЬКО с alter position. Иначе все работает отлично. А автономная транзакция у меня затесалась по той причине, что в 2.5
нельзя было сделать drop view -> alter table -> create view в одной транзакции. В 4.0 можно, поэтому у себя то я этот вопрос решил.
Предыдущая тема: RN FB4.0.2. Ключевое слово ROUND
Следующая тема: SET DECFLOAT ROUND
Переход к форуму:
  


Текущее время: Wed Dec 18 16:21:03 GMT+3 2024

Общее время, затраченное на создание страницы: 0.01043 секунд