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.
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.
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.