Alter Table Problem

Hallo.

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.

Hoffe mal wieder auf gute Ratschläge

Den VIEW auch neu erstellen.

Andreas

Danke für die rasche Antwort.

Leider ist mir damit nicht so gut geholfen.

Die Views stehen selbst in einer Abhängigkeit.

Ich weiß auch nicht, wie ich einen Return eines Views ändern kann?!?

Bitte nochmals um eure Hilfe

Nun, du musst zumindest die Views löschen, dann die Tabelle ändern und dann die Views neu erstellen.

Das ist lästig, geht derzeit aber nicht anders.



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.



Andreas

restore - fertig

Hm.

Habe es jetzt über den Umweg gemacht, den ihr mir empfohlen habt.

Es ist allerdings schon sehr lästig, alle relevanten Views löschen, Tabelle ändern, Views neuerstellen.

Schade, dass es dafür noch keine komfortabele Lösung (abgesehen von store/restore) gibt.

Gruß & Danke

-Thread kann geschloßen werden-

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.

Andreas

Danke für die Info!!