Изменить размер varchar в таблице RDB$FIELDS в Firebird

Я пытаюсь изменить размер varchar поля CODE моей таблицы FAIXA_VALORES, однако при попытке изменить его с помощью следующего кода:

update RDB$FIELDS set
    RDB$FIELD_LENGTH = 50,
    RDB$CHARACTER_LENGTH = 50
    where RDB$FIELD_NAME = 'RDB$14392222'

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

Операция UPDATE не разрешена для системной таблицы RDB$FIELDS.

Я пробовал с таблицей изменений, и это тоже не позволяло мне. Кто-нибудь может мне помочь?


person Gxbrielramires    schedule 01.03.2021    source источник
comment
Просто хочу обновить длину RDB$LENGHT varchar, но Firebird не разрешает ОБНОВЛЕНИЯ в системной таблице RDB$FIELDS. Вы можете мне помочь?   -  person Gxbrielramires    schedule 01.03.2021
comment
Вам действительно нужно прочитать примечания к выпуску Firebird 3. Прямые обновления системных таблиц больше не разрешены. (2 ). Вам нужно использовать ALTER TABLE вместо этого.   -  person Mark Rotteveel    schedule 01.03.2021
comment
Также см. Как изменить тип столбца в firebird3   -  person Mark Rotteveel    schedule 01.03.2021


Ответы (1)


Начиная с Firebird 3, прямая модификация системных таблиц больше не разрешена (за очень небольшим числом исключений); см. Изменения в системных таблицах и Системные таблицы теперь доступны для чтения. только. И даже до Firebird 3 такая практика не рекомендовалась.

Чтобы изменить размер столбца, вам нужно использовать ALTER TABLE, например

alter table YOUR_TABLE
  alter column YOUR_COLUMN type varchar(50)

На такое изменение накладывается ряд ограничений. Например, невозможно сделать столбец короче, чем его текущее определение. Таким образом, изменение VARCHAR(60) на VARCHAR(50) невозможно. Если вам нужно это сделать, вам нужно добавить новый столбец, скопировать содержимое из старого в новый (с изменениями, если необходимо), удалить старый столбец и переименовать новый столбец:

alter table YOUR_TABLE add NEW_COLUMN varchar(50);
commit;
update YOUR_TABLE set NEW_COLUMN = substring(YOUR_COLUMN from 1 for 50);
commit;
alter table drop YOUR_COLUMN;
alter table alter column NEW_COLUMN to YOUR_COLUMN;
commit;
person Mark Rotteveel    schedule 02.03.2021