Create Or Replace View (komplex, json, ..)

Hallo,
eine grundsätzliche Frage:
Ich habe einen View, der nicht ganz banal ist:

  • join
  • json

Wenn ich den View mit create or replace neu anlege, alles identisch, bis auf eine neue Spalte in einem inneren Select, erhalte ich die Fehlermeldung, dass er eine Spalte nicht umbenennen kann.
Warum ist das so?

Es gibt keine anderen Objekte, die diesen View weiter verwenden.
Meine Annahme wäre, dass er den View wegwirft und ihn neu baut. Egal, was vorher drin stand.

Und dazu: Ich habe einen Verdacht und ihr dürft jetzt über mich herfallen.
Der View enthält auf oberer Ebene ein “Select *”. Das ist gewollt, natürlich aus Bequemlichkeit, aber nicht nur.
Das Select “Schema” im View sieht im Prinzip so aus:
select * from (select …) a join (select …) b on a…=b…
Ich möchte alles aus den in Subselects angegebenen Clauses, immer, egal wie der View sich ändert.

es wäre leichter zu verstehen wenn man es nachvollziehen könnte …

Das ist eine (ärgerliche) Einschränkung von Postgres, dass ein CREATE OR REPLACE die Namen, Anzahl oder Datentypen der Spalten nicht ändern darf.

Du kommst um ein DROP VIEW IF EXISTS + CREATE VIEW nicht herum.

Solange Du keine ausgefeilten Benutzerrechte an der View hast, macht das auch keinen echten Unterschied.

Falls Du doch die Berechtigungen erhalten musst, dann pack einfach alles was Du für die View benötigst in ein Skript.

2 „Gefällt mir“

Das sind gute Hinweise, danke!

Ich habe es auch mal ohne * probiert -daran liegt es gar nicht- und wie man im Beispiel sehen kann, auch mit verschiedenen Reihenfolgen. Interessantes Zwischenergebnis.

create table tablea (aid int, avalue varchar(10));
create table tableb (bid int, bvalue varchar(10));

create or replace view viewab as
select aid, avalue 
  from tablea join tableb 
    on aid = bid;

create or replace view viewab as
select aid, avalue, bvalue 
  from tablea join tableb 
    on aid = bid;

create or replace view viewab as
select aid, bid, avalue, bvalue 
  from tablea join tableb 
    on aid = bid;

Ich weiß, Beispiele sind immer schöner.

Die Frage ist, warum das so gemacht wurde. Ich kann es nicht beurteilen, aber das mit den Rechten wäre immerhin ein Indikator, falls etwa Row Level Rechte vergeben wurden oder sowas.

Es hat also nichts mit Komplexität des Views, Json und anderem Kram zu tun.
Interessant, dass er immerhin Felder anhängen kann.

DROP VIEW IF EXISTS ist auch hilfreich.

Und noch eine kleine Ergänzung:

Man kann es sich zunutze machen, dass Felder anhängen funktioniert. Spaß macht es dann mit
Select *

Dabei muss man etwas umstellen.
Select * muss gewandelt werden in:

Select a.*, b.* ...

Solange man damit leben kann, dass man in den Subselects dann neue Felder in der Select Clause des Subselect wirklich am Ende ergänzt, funktioniert dann ein simples Create or Replace.

Geht natürlich nicht immer mit den Randbedingungen, aber für adhoc Entwicklung angenehm.

Dieses Thema wurde automatisch 60 Tage nach der letzten Antwort geschlossen. Es sind keine neuen Antworten mehr erlaubt.