Как изменить тип столбца в firebird3

Начиная с firebird 3 я не могу изменить тип столбца

Прежде чем использовать такое обновление:

update RDB$RELATION_FIELDS set
RDB$FIELD_SOURCE = 'MYTEXT'
where (RDB$FIELD_NAME = 'JXML') and
(RDB$RELATION_NAME = 'XMLTABLE')

потому что я получаю ошибку ISC 335545030.

Может быть, в firebird 3 есть другой способ?


person user3179515    schedule 15.01.2018    source источник
comment
Ошибка 335545030: операция @1 не разрешена для системной таблицы @2   -  person Mark Rotteveel    schedule 15.01.2018


Ответы (2)


Firebird 3 больше не допускает прямого обновления системных таблиц, поскольку это был способ потенциально повредить базу данных. См. также Системные таблицы теперь Только для чтения в примечаниях к выпуску. Вам нужно будет использовать операторы DDL для модификации.

Похоже, вы хотите изменить тип данных столбца на домен. Вам нужно будет использовать alter table ... alter column ... для этого. В частности, вам нужно будет сделать:

alter table XMLTABLE
    alter column JXML type MYTEXT;

Это связано с некоторыми ограничениями:

Изменение типа данных столбца: ключевое слово TYPE

Ключевое слово TYPE изменяет тип данных существующего столбца на другой допустимый тип. Изменение типа, которое может привести к потере данных, будет запрещено. Например, количество символов в новом типе для столбца CHAR или VARCHAR не может быть меньше, чем существующая спецификация для него.

Если столбец был объявлен как массив, изменение его типа или количества измерений не допускается.

Тип данных столбца, связанного с внешним ключом, первичным ключом или ограничением уникальности, вообще нельзя изменить.

Этот оператор был доступен еще до Firebird 1 (InterBase 6.0).

person Mark Rotteveel    schedule 15.01.2018
comment
Например, для blob не разрешено, как лучше всего изменить кодировку в текстовом столбце blob? - person user3179515; 16.01.2018
comment
@user3179515 user3179515 Единственный реальный способ — добавить новый столбец и обновить, чтобы присвоить значение старого столбца новому столбцу (при необходимости с соответствующими приведениями), удалить старый столбец и переименовать новый столбец. - person Mark Rotteveel; 16.01.2018
comment
@ user3179515 внезапно было сказано, что BLOB представляют собой риск потери данных здесь: tracker.firebirdsql.org/browse/ CORE-6052 - person Arioch 'The; 10.07.2019

Руководство по Firebird 2.5

https://www.firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25-ddl-tbl.html

 ALTER TABLE tabname ALTER COLUMN colname TYPE typename
person Arioch 'The    schedule 15.01.2018
comment
В Firebird 2.5 есть вещи, которые вы не можете сделать. Например, изменение свойства not null... В Firebird 3.0 это нормально - person Hugues Van Landeghem; 10.07.2019
comment
@HuguesVanLandeghem это правда в обоих случаях. Если вы вводите свои столбцы с именем DOMAINs, то в FB2 вы можете изменить тип поля с одного domain на другой, напрямую изменив системную таблицу. В FB3 системные таблицы были сделаны доступными только для чтения. Однако они по-прежнему не предлагают SQL для перехода от VarChar domain к другому в определении столбца. Я сейчас точно не помню, был ли пункт назначения domain длиннее VarChar или BLOB SUB_TYPE TEXT, но это просто не сработало - person Arioch 'The; 10.07.2019