Problem mit sequences

Hallo,

so wie’s aussieht bekomme ich das mit den Sequenzen noch nicht gebacken. Wenn ich in einer Tabellen-Definition den Spaltentyp ‘bigserial’ verwende, wird die Sequence erzeugt. Soweit so gut. Jetzt verwende ich aber einen Benutzer mit ziemlich eingeschränkgen Rechten, d.h. bei der Erstellung einer Tabelle bekommt der Benutzer seine Rechte zugewiesen.
Mit dem Insert-Recht auf eine Tabelle ist leider nicht das Update-Recht der Sequence verbunden.

Ferner bemerkte ich, dass wenn ich eine Tabelle anlege, lösche und dann wieder anlege, dass dann eine 2. Sequence erzeugt wird, mit einer 1 an den Namen angehängt.

Das hat mich zu der Idee geführt, die Erstellung der Sequence selbst zu machen.
Im Handbuch bei der Erklärung der Datentypen wird beim Typ ‘Serial’ aufgeführt, welche Befehlssequenz dem Datentyp ‘Serial’ entspricht. Das habe ich in mein Init-Script übernommen, erweitert um den Grant-Befehl auf die Sequenz. Mein init sieht also folgendermaßen aus:

create sequence "schema"."tabelle_id_seq";
create table "schema"."tabelle" ( 
id bigint not null default nextval("schema"."tabelle_id_seq"),
 ... primary key("id")
);
alter sequence "schema"."tabelle_id_seq" owned by "schema"."tabelle"."id";
Grant tabelle;
Grant sequence;

Das Anlegen der Sequenz klappt, beim Anlegen der Tabelle erhalte ich den Fehler

FEHLER:  fehlender Eintrag in FROM-Klausel für Tabelle »schema«

Habe es dann auch über Alter table probiert und erhalte dann beim nextval die Fehlermeldung

FEHLER:  Spalte »schema.tabelle_id_seq« existiert nicht

irgendwie sitze ich auf der Leitung und wäre für einen Nasenstubser dankbar.

Gruß Santi

P.S.: ich verwende Version 8.4.7 unter debian squeeze

serial und bigserial sind pseudotypen … die bei der verwendung in CREATE TABLE genau das machen, was du per hand schon erledigt hast.

wenn du spaeter eine tabelle loeschst wird natuerlich umgekehrt die sequence nicht mit geloescht - das ist ein eigensteaendiges db-objekt.

dann hast du die tabelle wieder mit dem pseudotypen erzeugt - der natuerlich einen anderen namen fuer die neue sequence verwendete. der bevorzugte name war ja noch besetzt durch die nicht geloeschte seq.

du kannst dir nach verwendung von bigserial ja mal anschauen wie die tabelle aufgebaut ist - da wirst du den typen nicht mehr finden, stattdessen eben bigint mit default auf nextval(‘sequencename’);

das ist eigentlich schon alles

Nicht, wenn man die sequence mit “OWNED BY” mit der Spalte verknüpft.


Bei welchem Statement tritt dieser Fehler denn auf. Das müsste doch bei einem SELECT passieren, bei den von Dir gezeigten Statements kann das doch eigentlich gar nicht sein.

cool

wieder was gelernt …

Schön, dass wir uns mit dem “eigentlich” einig sind :slight_smile:

Der Fehler tritt bei dem ALTER TABLE auf, bei dem die Sequence der Spalte zugeordnet werden soll. Vermutlich läuft da implizit eben ein select ab.

Ich habe daraufhin versucht, die Grants vorzuziehen, aber egal wie, das ALTER TABLE mag nicht. Könnte es sein, dass die explizite Variante garkeine Unterstützung für Schemata bietet?

Ich habe die DB ans Laufen bekommen, indem ich dem Benutzer alle Rechte für die Datenbank erteilt habe. Das gefällt mir aber nicht, deshalb wäre ich sehr dankbar, wenn es einen anderen Weg gäbe (also bei dem der Benutzer nicht gleichzeitig der Besitzer der Objekte ist).

Gruß Santi

Kannst Du die Statements mal in psql laufen lassen und die Ausgaben (inkl. Deiner kompletten Statements) kopieren und mal hier posten? Irgendwas passt da nicht zusammen.

Ich habe daraufhin versucht, die Grants vorzuziehen, aber egal wie, das ALTER TABLE mag nicht. Könnte es sein, dass die explizite Variante garkeine Unterstützung für Schemata bietet?

Auch hier nochmal, poste doch mal das vollständige Skript am besten nicht mit “dummy” Namen für die Tabellen, sonder wirklich so wie Du das in psql ausführst.