powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Переименование поля при наличии зависимого триггера (в одной транзакции).
24 сообщений из 24, страница 1 из 1
Переименование поля при наличии зависимого триггера (в одной транзакции).
    #39606923
Hommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не получается. Приходится дробить на две транзакции. В первой удаляем зависимый триггер, во второй переименовываем поле и создаём триггер заново.
На переименовании случилась ошибка и таблица оказалась без триггера.
...
Рейтинг: 0 / 0
Переименование поля при наличии зависимого триггера (в одной транзакции).
    #39606936
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hommer,

и не только при "наличии зависимого триггера"

зы. лучше было-бы закоментарить тело триггера, а не удалять его
...
Рейтинг: 0 / 0
Переименование поля при наличии зависимого триггера (в одной транзакции).
    #39606950
Hommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Неудобно что есть такое неинтуитивное поведение.
При комментировании тоже нужно на две транзакции разбивать.
...
Рейтинг: 0 / 0
Переименование поля при наличии зависимого триггера (в одной транзакции).
    #39606951
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HommerНеудобно что есть такое неинтуитивное поведение.

Это реальность, данная нам в ощущениях. Либо смирись, либо...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Переименование поля при наличии зависимого триггера (в одной транзакции).
    #39606954
Hommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovHommerНеудобно что есть такое неинтуитивное поведение.

Это реальность, данная нам в ощущениях. Либо смирись, либо...

Можно создать триггер использующий поле и сразу это поле переименовать, ошибки не будет. Ошибка возникнет только при коммите.
А в моём случае ошибка происходит на переименовании, хотя коммит наверняка прошёл бы верно, ведь зависимостей уже не будет. Очень похоже что там просто ошибка в обработке таких случаев.
...
Рейтинг: 0 / 0
Переименование поля при наличии зависимого триггера (в одной транзакции).
    #39606958
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HommerОчень похоже что там просто ошибка в обработке таких случаев.

Нет там ошибки. Просто кое-кто не доделал отложенную валидацию объектов БД, ограничившись
полем в системных таблицах "чтобы было как у Оракула".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Переименование поля при наличии зависимого триггера (в одной транзакции).
    #39606989
Hommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovHommerОчень похоже что там просто ошибка в обработке таких случаев.

Нет там ошибки. Просто кое-кто не доделал отложенную валидацию объектов БД, ограничившись
полем в системных таблицах "чтобы было как у Оракула".

В одной транзакции удаляем все внешние ключи ссылающиеся на таблицу и потом саму таблицу. Работает.
В одной транзакции удаляем все внешние ключи по полю и потом переименоваваем поле. Работает.

В одной транзакции удаляем все триггеры использующие поле и потом удаляем само поле. Работает.
В одной транзакции удаляем все триггеры использующие поле и потом переименовываем поле. Не работает.

Я вижу что в других случаях валидация идёт по мере выполнения. А при переименовании, с предшествующим ему дропом триггера, что-то идёт не как обычно.
...
Рейтинг: 0 / 0
Переименование поля при наличии зависимого триггера (в одной транзакции).
    #39607025
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hommer,

переименование столбца - это одно из изменений формата данных. Которое требует коммита. После чего только можно обращаться к измененным метаданным.
То есть, коммита требует именно изменение структуры таблицы. Триггеры и ФК к структуре таблицы (и формату записи) отношения не имеют.
...
Рейтинг: 0 / 0
Переименование поля при наличии зависимого триггера (в одной транзакции).
    #39607027
Hommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdvHommer,

переименование столбца - это одно из изменений формата данных. Которое требует коммита. После чего только можно обращаться к измененным метаданным.
То есть, коммита требует именно изменение структуры таблицы. Триггеры и ФК к структуре таблицы (и формату записи) отношения не имеют.
Если столбец не переименовывать, а удалить, то ошибки нет.
Это баг по всем признакам.
...
Рейтинг: 0 / 0
Переименование поля при наличии зависимого триггера (в одной транзакции).
    #39607055
HommerВ одной транзакции удаляем все триггеры использующие поле и потом переименовываем поле. Не работает.в рамках одной транзакции можно:
* дропнуть триггер, использующий старое поле;
* добавить новое поле (оно окажется в "хвосте" структуры таблицы);
* удалить старое поле;
* вызвать alter field position <N>, где N = тому положению среди остальных полей, куда надо поместить добавленное только что поле;
* создать триггер с новым кодом, в котором будт обращение к новому полю.

Достаточно просто юзать set autoddl off.
Код: 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.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
recreate table test(
    mio int -- will be "renamed" to: "rio", position will be the same
   ,foo int -- will be "renamed" to: "bar", position will be the same
   ,mau int -- will be "renamed" to: "waw", position will be the same
   ,bee int -- will be "renamed" to: "aaa", position will be the same
);

set term ^;
create or alter trigger trg_test_bi for test before insert as
begin
   new.bee = coalesce(new.bee, new.foo - new.mau + new.mio);
end
^
set term ;^
commit;

----- test-a: alter fields + change trigger + rollback ==> check that DDL was not changed ----


set autoddl off;
drop trigger trg_test_bi;
alter table test
     add aaa int
    ,drop bee
    ,alter aaa position 4
  
    ,add bar int
    ,drop foo
    ,alter bar position 2

    ,add rio int
    ,drop mio
    ,alter rio position 1

    ,add waw int
    ,drop mau
    ,alter waw position 3
;

set term ^;
create or alter trigger trg_test_bi for test before insert as
begin
   new.aaa = new.bar / nullif(new.rio + new.waw, 0);
end
^
set term ;^

rollback;
show table test;
show trigger trg_test_bi;

commit;

----- test-b: alter fields + change trigger + commit ==> check that DDL was altered ----


set autoddl off;
drop trigger trg_test_bi;
alter table test
     add aaa int
    ,drop bee
    ,alter aaa position 4

    ,add bar int
    ,drop foo
    ,alter bar position 2

    ,add rio int
    ,drop mio
    ,alter rio position 1

    ,add waw int
    ,drop mau
    ,alter waw position 3
;

set term ^;
create or alter trigger trg_test_bi for test before insert as
begin
   new.aaa = new.bar / nullif(new.rio + new.waw, 0);
end
^
set term ;^
commit;

show table test;
show trigger trg_test_bi;



Output:

Код: 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.
MIO                             INTEGER Nullable
FOO                             INTEGER Nullable
MAU                             INTEGER Nullable
BEE                             INTEGER Nullable

Triggers on Table TEST:
TRG_TEST_BI, Sequence: 0, Type: BEFORE INSERT, Active

Triggers on Table TEST:
TRG_TEST_BI, Sequence: 0, Type: BEFORE INSERT, Active
as
begin
   new.bee = coalesce(new.bee, new.foo - new.mau + new.mio);
end
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
RIO                             INTEGER Nullable
BAR                             INTEGER Nullable
WAW                             INTEGER Nullable
AAA                             INTEGER Nullable

Triggers on Table TEST:
TRG_TEST_BI, Sequence: 0, Type: BEFORE INSERT, Active

Triggers on Table TEST:
TRG_TEST_BI, Sequence: 0, Type: BEFORE INSERT, Active
as
begin
   new.aaa = new.bar / nullif(new.rio + new.waw, 0);
end
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

...
Рейтинг: 0 / 0
Переименование поля при наличии зависимого триггера (в одной транзакции).
    #39607263
Hommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ованес СусанянHommerВ одной транзакции удаляем все триггеры использующие поле и потом переименовываем поле. Не работает.в рамках одной транзакции можно:
* дропнуть триггер, использующий старое поле;
* добавить новое поле (оно окажется в "хвосте" структуры таблицы);
* удалить старое поле;
* вызвать alter field position <N>, где N = тому положению среди остальных полей, куда надо поместить добавленное только что поле;
* создать триггер с новым кодом, в котором будт обращение к новому полю.

Достаточно просто юзать set autoddl off.
Код: 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.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
recreate table test(
    mio int -- will be "renamed" to: "rio", position will be the same
   ,foo int -- will be "renamed" to: "bar", position will be the same
   ,mau int -- will be "renamed" to: "waw", position will be the same
   ,bee int -- will be "renamed" to: "aaa", position will be the same
);

set term ^;
create or alter trigger trg_test_bi for test before insert as
begin
   new.bee = coalesce(new.bee, new.foo - new.mau + new.mio);
end
^
set term ;^
commit;

----- test-a: alter fields + change trigger + rollback ==> check that DDL was not changed ----


set autoddl off;
drop trigger trg_test_bi;
alter table test
     add aaa int
    ,drop bee
    ,alter aaa position 4
  
    ,add bar int
    ,drop foo
    ,alter bar position 2

    ,add rio int
    ,drop mio
    ,alter rio position 1

    ,add waw int
    ,drop mau
    ,alter waw position 3
;

set term ^;
create or alter trigger trg_test_bi for test before insert as
begin
   new.aaa = new.bar / nullif(new.rio + new.waw, 0);
end
^
set term ;^

rollback;
show table test;
show trigger trg_test_bi;

commit;

----- test-b: alter fields + change trigger + commit ==> check that DDL was altered ----


set autoddl off;
drop trigger trg_test_bi;
alter table test
     add aaa int
    ,drop bee
    ,alter aaa position 4

    ,add bar int
    ,drop foo
    ,alter bar position 2

    ,add rio int
    ,drop mio
    ,alter rio position 1

    ,add waw int
    ,drop mau
    ,alter waw position 3
;

set term ^;
create or alter trigger trg_test_bi for test before insert as
begin
   new.aaa = new.bar / nullif(new.rio + new.waw, 0);
end
^
set term ;^
commit;

show table test;
show trigger trg_test_bi;



Output:

Код: 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.
MIO                             INTEGER Nullable
FOO                             INTEGER Nullable
MAU                             INTEGER Nullable
BEE                             INTEGER Nullable

Triggers on Table TEST:
TRG_TEST_BI, Sequence: 0, Type: BEFORE INSERT, Active

Triggers on Table TEST:
TRG_TEST_BI, Sequence: 0, Type: BEFORE INSERT, Active
as
begin
   new.bee = coalesce(new.bee, new.foo - new.mau + new.mio);
end
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
RIO                             INTEGER Nullable
BAR                             INTEGER Nullable
WAW                             INTEGER Nullable
AAA                             INTEGER Nullable

Triggers on Table TEST:
TRG_TEST_BI, Sequence: 0, Type: BEFORE INSERT, Active

Triggers on Table TEST:
TRG_TEST_BI, Sequence: 0, Type: BEFORE INSERT, Active
as
begin
   new.aaa = new.bar / nullif(new.rio + new.waw, 0);
end
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


После переименования данные должны сохраниться. У вас они теряются.
...
Рейтинг: 0 / 0
Переименование поля при наличии зависимого триггера (в одной транзакции).
    #39607484
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hommer...
После переименования данные должны сохраниться. У вас они теряются.
У нас сохраняются. Теряются - у вас.
...
Рейтинг: 0 / 0
Переименование поля при наличии зависимого триггера (в одной транзакции).
    #39608690
Hommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Переименование поля при наличии зависимого триггера (в одной транзакции).
    #39609921
_Hommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Почти семь лет назад: http://tracker.firebirdsql.org/browse/CORE-3458

Нужели никто больше не натыкался на невозможность переименования поля с предварительным дропом зависимых триггеров и их последующим созданием одной транзакцией?
...
Рейтинг: 0 / 0
Переименование поля при наличии зависимого триггера (в одной транзакции).
    #39610012
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У всех, очевидно, получается называть поле правильно с первой попытки.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Переименование поля при наличии зависимого триггера (в одной транзакции).
    #39610014
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

не обязательно. Просто используют автокоммит для DDL
...
Рейтинг: 0 / 0
Переименование поля при наличии зависимого триггера (в одной транзакции).
    #39610034
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисDimitry Sibiryakov,

не обязательно. Просто используют автокоммит для DDL
Или используют коммит после каждого изменения метаданных, которое может повлиять на другие стейтменты в этой транзакции.
...
Рейтинг: 0 / 0
Переименование поля при наличии зависимого триггера (в одной транзакции).
    #39610036
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_HommerПочти семь лет назад: http://tracker.firebirdsql.org/browse/CORE-3458

Нужели никто больше не натыкался на невозможность переименования поля с предварительным дропом зависимых триггеров и их последующим созданием одной транзакцией?
Эта возможность никому не нужна. Изменения метаданных должны быть редкими выполняться монопольно. В идеале, конечно, но лучше к этому стремиться, чем пытаться сделать плохое решение, превозмогая трудности.
...
Рейтинг: 0 / 0
Переименование поля при наличии зависимого триггера (в одной транзакции).
    #39610037
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockредкими выполняться монопольно
редкими выполняться и монопольно
...
Рейтинг: 0 / 0
Переименование поля при наличии зависимого триггера (в одной транзакции).
    #39610038
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Та елки палки, и исправил неправильно - и в другом месте.
...
Рейтинг: 0 / 0
Переименование поля при наличии зависимого триггера (в одной транзакции).
    #39610113
Hommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YuRock_HommerПочти семь лет назад: http://tracker.firebirdsql.org/browse/CORE-3458

Нужели никто больше не натыкался на невозможность переименования поля с предварительным дропом зависимых триггеров и их последующим созданием одной транзакцией?
Эта возможность никому не нужна. Изменения метаданных должны быть редкими выполняться монопольно. В идеале, конечно, но лучше к этому стремиться, чем пытаться сделать плохое решение, превозмогая трудности.
В Firebird любая логически правильная последовательность ddl-запросов отрабатывает без промежуточных коммитов и при ошибке откатывается целиком. Если это вдруг не так, то это ошибка в коде.
...
Рейтинг: 0 / 0
Переименование поля при наличии зависимого триггера (в одной транзакции).
    #39610152
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HommerВ Firebird любая логически правильная последовательность ddl-запросов отрабатывает без промежуточных коммитов и при ошибке откатывается целиком. Если это вдруг не так, то это ошибка в коде.
скорее недоработка. Ибо слово любая является преувеличением, всегда бывают какие-либо ограничения. Именно этот конкретный случай вроде можно доработать, патч я сейчас тестирую.
...
Рейтинг: 0 / 0
Переименование поля при наличии зависимого триггера (в одной транзакции).
    #39610171
Hommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dimitrHommerВ Firebird любая логически правильная последовательность ddl-запросов отрабатывает без промежуточных коммитов и при ошибке откатывается целиком. Если это вдруг не так, то это ошибка в коде.
Ибо слово любая является преувеличением, всегда бывают какие-либо ограничения.
Эти оператры все можно?
Код: 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.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
CREATE DOMAIN
ALTER DOMAIN
DROP DOMAIN

CREATE TABLE
ALTER TABLE
DROP TABLE
RECREATE TABLE

CREATE INDEX
ALTER INDEX
DROP INDEX

SET STATISTICS

CREATE VIEW
ALTER VIEW
CREATE OR ALTER VIEW
DROP VIEW
RECREATE VIEW

CREATE TRIGGER
ALTER TRIGGER
CREATE OR ALTER TRIGGER
DROP TRIGGER
RECREATE TRIGGER

CREATE PROCEDURE
ALTER PROCEDURE
CREATE OR ALTER PROCEDURE
DROP PROCEDURE
RECREATE PROCEDURE

CREATE FUNCTION
ALTER FUNCTION
CREATE OR ALTER FUNCTION
DROP FUNCTION
RECREATE FUNCTION

CREATE PACKAGE
ALTER PACKAGE
CREATE OR ALTER PACKAGE
DROP PACKAGE
RECREATE PACKAGE

CREATE PACKAGE BODY
ALTER PACKAGE BODY
DROP PACKAGE BODY
RECREATE PACKAGE BODY

DECLARE EXTERNAL FUNCTION
ALTER EXTERNAL FUNCTION
DROP EXTERNAL FUNCTION

DECLARE FILTER
DROP FILTER

CREATE SEQUENCE
ALTER SEQUENCE
CREATE OR ALTER SEQUENCE
DROP SEQUENCE
RECREATE SEQUENCE

SET GENERATOR

CREATE EXCEPTION
ALTER EXCEPTION
CREATE OR ALTER EXCEPTION
DROP EXCEPTION
RECREATE EXCEPTION

CREATE COLLATION
DROP COLLATION

ALTER CHARACTER SET

CREATE ROLE
ALTER ROLE
DROP ROLE

COMMENT ON
...
Рейтинг: 0 / 0
Переименование поля при наличии зависимого триггера (в одной транзакции).
    #39610239
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hommer,

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


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