Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / unknown ISC error 335544989 при добавлении поля в таблицу / 10 сообщений из 10, страница 1 из 1
01.02.2017, 19:34
    #39396705
sysdba22
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
unknown ISC error 335544989 при добавлении поля в таблицу
Может кто сталкивался?

Сервер Fb 3.0.2 (проверялось и на 3.0.0). 64 бит.

При добавлении поля в таблицу и последующем комите транзакции ошибка:

авторThis operation is not defined for system tables.
unsuccessful metadata update.
unknown ISC error 335544989.


Запрос:

Код: plsql
1.
alter table gd_currrate add val dcurrrate



домен создан как:

Код: plsql
1.
2.
3.
4.
CREATE DOMAIN dcurrrate AS
  DECIMAL(15, 10)
  CHECK(VALUE >= 0)
  NOT NULL



На 2.5, на аналогичных базах, выполнение операции не приводит к ошибке.

Лог на сервере не содержит никаких сообщений об ошибках.
...
Рейтинг: 0 / 0
01.02.2017, 19:40
    #39396709
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
unknown ISC error 335544989 при добавлении поля в таблицу
"Cannot make field VAL of table GD_CURRRATE NOT NULL because there are NULLs present"
клиента обнови
...
Рейтинг: 0 / 0
01.02.2017, 20:21
    #39396739
sysdba22
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
unknown ISC error 335544989 при добавлении поля в таблицу
dimitr,

какое-то вуду ((

1. проверяю что поля нет

2. добавляю поле

Код: plsql
1.
alter table gd_currrate add val dcurrrate



3. если сразу комитить транзакцию -- то будет ошибка, как описано выше.
ок, транзакцию не трогаем, а пытаемся выполнить сразу же запрос:

Код: plsql
1.
update gd_currrate set val=1



Получаем ошибку:

авторColumn does not belong to referenced table.
Dynamic SQL Error.
SQL error code = -206.
Column unknown.
VAL.
At line 1, column 24.

4. Пытаемся комитить транзакцию. Получаем ошибку:

Код: plsql
1.
2.
3.
4.
Cannot commit transaction:
This operation is not defined for system tables.
unsuccessful metadata update.
unknown ISC error 335544989.



5. Но! Сразу же после ошибки, в этой же транзакции, уже проходит
указанный выше запрос:

Код: plsql
1.
update gd_currrate set val=1



6. и вот теперь только мы можем закомитить транзакцию!


Получается, пока транзакция не кинет ошибку, сервер не знает что
у него в таблице уже есть такая колонка.
...
Рейтинг: 0 / 0
01.02.2017, 21:09
    #39396761
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
unknown ISC error 335544989 при добавлении поля в таблицу
проверка на нуллы (наличие записей в данном случае) выполняется при коммите. До него поля физически нет. На момент проверки - уже есть. Но это все артефакты реализации, на которые не надо закладываться. Поле на непустую таблицу надо добавлять либо nullable (потом апдейтить и превращать в NOT NULL), либо с заданным DEFAULT-ом. Все остальное ересь.
...
Рейтинг: 0 / 0
02.02.2017, 08:48
    #39396935
sysdba22
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
unknown ISC error 335544989 при добавлении поля в таблицу
dimitr,

1. Это ломает существующую функциональность, так как ФБ до версии 3 работал по другому.
Хорошо, когда есть под рукой исходники программы и время на исправление, а если нет?

2. DEFAULT значение здесь не выход. В данном случае поле не может быть НУЛЛ, но,
если передан НУЛЛ или поле не указано в запросе INSERT, то действует триггер, который
вычисляет и заполняет это поле соответствующим образом.

Фактически, единственный путь сохранить действующую логику -- это расширить
область допустимых значений домена, втиснув туда еще и значение для
ПСЕВДО НУЛЛ (например, -1 в моем случае). Указать его для DEFAULT, и обрабатывать
в триггере так, как будто это НУЛЛ.

Это же бред -- вырезание гланд автогеном через ректальный проход.

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

Кажется мелочь, а на самом деле огромная проблема. Я думаю не только у нас.
...
Рейтинг: 0 / 0
02.02.2017, 09:17
    #39396952
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
unknown ISC error 335544989 при добавлении поля в таблицу
sysdba22,

не мути воду. Добавление NOT NULLABLE поля в таблицу в которой есть данные переводит БД в неконсистентное состояние. До 3.0 этот оператор часто приводил к "невосстановимым" бекапам, если после этого не был выполнен нужный UPDATE.

sysdba22Кажется мелочь, а на самом деле огромная проблема. Я думаю не только у нас.

похоже только у вас, потому что другие прекрасно знают как решить эту "проблему".

твоя проблема решается так

Код: sql
1.
2.
alter table gd_currrate add val dcurrrate default 1;
alter table gd_currrate alter val drop default;
...
Рейтинг: 0 / 0
02.02.2017, 09:34
    #39396971
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
unknown ISC error 335544989 при добавлении поля в таблицу
sysdba22Это ломает существующую функциональность, так как ФБ до версии 3 работал по другому.
он работал неправильно

sysdba22Хорошо, когда есть под рукой исходники программы и время на исправление, а если нет?
не надо мигрировать программы без исходников на новую версию СУБД

sysdba22DEFAULT значение здесь не выход
я предложил и другой вариант
...
Рейтинг: 0 / 0
02.02.2017, 10:10
    #39397004
sysdba22
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
unknown ISC error 335544989 при добавлении поля в таблицу
dimitr,

авторпотом апдейтить и превращать в NOT NULL

а как, если у домена нельзя менять NOT NULL?

https://firebirdsql.org/manual/nullguide-change-domain-nullability.html#d0e25188
...
Рейтинг: 0 / 0
02.02.2017, 10:14
    #39397011
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
unknown ISC error 335544989 при добавлении поля в таблицу
sysdba22,

ну ты чего ссылку то даёшь на документ 2007 года? В тройке можно.
...
Рейтинг: 0 / 0
02.02.2017, 10:26
    #39397019
sysdba22
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
unknown ISC error 335544989 при добавлении поля в таблицу
Симонов Денис,

точно есть:

Код: plsql
1.
ALTER DOMAIN <domain name> { DROP | SET } [NOT] NULL
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / unknown ISC error 335544989 при добавлении поля в таблицу / 10 сообщений из 10, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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