Ich habe eine Spalte in einer Tabelle vom Typ varchar(64).
Nun muss ich den Typ (leider) auf varchar(128) erweitern.
Klappt aber nicht.
Fehlermeldung:
ERROR: cannot alter type of a column used by a view or rule
DETAIL: rule_RETURN on view … depends on column “name”
Ist doch blödsinn, da ich nur eine Erweiterung der Zeichenanzahl setzen möchte. Es muss doch keine Typkonvertierung vorgenommen werden!
Wie komme ich aus der Miserie effizient und schnell raus?
Den Umweg, die Tabelle zu sichern, neue Tabelle erstellen mit genug Zeichen in der einen Spalte, Werte importieren, alte Tabelle löschen, ist zu aufwendig und kollidiert sicherlich mit vielen Abhängigkeiten.
test=# create table v (t char(4));
CREATE TABLE
test=*# create view view_v as select * from v;
CREATE VIEW
test=*# alter table v alter column t type char(8);
ERROR: cannot alter type of a column used by a view or rule
DETAIL: rule _RETURN on view view_v depends on column "t"
Nochmals: wenn Du in einer Tabelle eine Spalte änderst, auf die z.B. via RULE in einem VIEW zugegriffen wird, dann ist diese RULE und damit der VIEW auch zu ändern, denn auch dort steht der Typ der Spalte drin:
test=!# rollback;
ROLLBACK
test=# create table v (t char(4));
CREATE TABLE
test=*# create view view_v as select * from v;
CREATE VIEW
test=*# \d view_v
View "public.view_v"
Column | Type | Modifiers
--------+--------------+-----------
t | character(4) |
View definition:
SELECT v.t
FROM v;
Ich kenne keinen (offiziellen) Weg, dies zu umgehen. Mag sein, daß man an Systemtabellen rumfummeln könnte, aber sowas will man eher nicht tun.
Also, den VIEW erst mal löschen, Tabelle umstrukturieren, VIEW neu erstellen.
Doch, gibt es. Verwende einen CHECK-Constraint auf die Länge der Spalte und TEXT als Datentyp anstatt varchar(N). Dann kannst Du via ALTER TABLE diesen Constraint löschen und neu definieren, ohne alle darauf basierenden VIEWS neu erstellen zu müssen.