更改 Firebird 中 RDB$FIELDS 表中 varchar 的大小

问题描述

我正在尝试更改 FAIXA_VALORES 表的 CODE 字段的 varchar 大小,但是在尝试使用以下代码更改时:

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

但它返回以下错误

系统表 RDB$FIELDS 不允许 UPDATE 操作。

我尝试过使用 alter table,但它也不允许我这样做。有人可以帮我吗?

解决方法

从 Firebird 3 开始,不再允许直接修改系统表(极少数例外);参见 Changes to System TablesSystem Tables are Now Read-only。甚至在 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;