Was sind die gültigen Formate eines PostgreSQL-Schemanamens?

12

Ich kann anscheinend keine Dokumentation finden, die die gültigen Formate eines PostgreSQL-Schemanamens beschreibt. Ich weiß, dass ein Schemaname nicht:

  • Beginnen Sie mit einer Zahl
  • Leerzeichen haben
  • beginnen mit pg_

Was sonst? Wo soll ich suchen

Ramon Tayag
quelle

Antworten:

16

Per feiner Dokumentation , ich glaube , das sein könnte , was Sie suchen.

SQL-Bezeichner und Schlüsselwörter müssen mit einem Buchstaben (az, aber auch Buchstaben mit diakritischen Zeichen und nicht-lateinischen Buchstaben) oder einem Unterstrich (_) beginnen. Nachfolgende Zeichen in einem Bezeichner oder Schlüsselwort können Buchstaben, Unterstriche, Ziffern (0-9) oder Dollarzeichen ($) sein. Beachten Sie, dass Dollarzeichen in Bezeichnern gemäß dem Buchstaben des SQL-Standards nicht zulässig sind, sodass ihre Verwendung Anwendungen möglicherweise weniger portabel macht ...

gsiems
quelle
Vielen Dank. Ich werde diese Anweisungen befolgen und prüfen, ob dies gültige Schemanamen sind. Wenn ja, dann werde ich das akzeptieren.
Vielleicht möchten Sie pg_diesem Link einen Unterstrich hinzufügen , wie Nathan C erwähnt hat .
Ramon Tayag
5

Laut Dokumentation kann es auch nicht damit beginnen, pg_da es reserviert ist. Davon abgesehen sieht es ziemlich frei aus.

Nathan C.
quelle
Danke, ich werde das zur Liste der Schemas hinzufügen, die nicht benannt werden können. Leider ist dies anscheinend nicht die einzige Regel. Ich könnte es benennen this-is schemaund es wäre immer noch ein ungültiger Schemaname.
3
@Ramon: this-is oder this-is schema sind streng genommen gültige Schemanamen. Sie scheinen zu verwirrend zu sein , was gilt mit , wenn es angegeben werden müssen .
Daniel Vérité
Ja, du hast wahrscheinlich recht. Lassen Sie mich das untersuchen.
Ramon Tayag
3

Die richtige Antwort ist die von gsiems. Ich möchte jedoch darauf hinweisen, dass PostgreSQL Regeln für zitierte Bezeichner enthält, die Sie möglicherweise berücksichtigen. "Bezeichner in Anführungszeichen können ein beliebiges Zeichen enthalten, mit Ausnahme des Zeichens mit dem Code Null. (Um ein doppeltes Anführungszeichen einzuschließen, schreiben Sie zwei doppelte Anführungszeichen.)" ... Es gibt auch einige Einschränkungen für den Fall, den Sie möglicherweise betrachten möchten.

Wenn Sie also Ihre Bezeichner angeben möchten, können Sie ein beliebiges Zeichen verwenden (mit Ausnahme von \ 0). Wenn Sie Ihre Bezeichner jedoch nicht angeben, müssen Sie die auf dieser Seite aufgeführten Regeln befolgen.

Ich wollte darauf hinweisen, vor allem, weil es mich schon einmal gebissen hat, insbesondere die Regeln für Groß- und Kleinschreibung in nicht zitierten Bezeichnern (und Schemanamen gelten als Bezeichner).

AKTUALISIEREN:

Als Beispiel (nicht speziell für Schemakennungen, aber gleichermaßen für sie):

    DROP TABLE "tbluser"; -- assuming it exists
    DROP TABLE "TBLUSER"; -- assuming it exists; incidentally, they are two different tables
    CREATE TABLE "TBLUSER" ( username text ); 
    INSERT INTO "TBLUSER" VALUES ( 'joe' ); 
    SELECT * FROM TBLUSER; -- this returns an error that the tbluser relation does not exist
    SELECT * FROM "TBLUSER"; -- works fine

Dies ist möglicherweise ein zu erwartendes Verhalten für diejenigen, die Erfahrung mit PostgreSQL (und möglicherweise den SQL-Standards) haben, aber jemand, der neu in PG ist und vom Standpunkt anderer Datenbankserver (z. B. SQL Server oder Oracle) stammt, kann auf dieses Verhalten stoßen und Ich frage mich, warum die Tabelle, die sie gerade erstellt haben, fehlt.

Vielleicht empfehlen einige Handbücher , keine Anführungszeichen in Anführungszeichen zu verwenden , aber Tatsache ist, dass Anführungszeichen in Anführungszeichen zur Verfügung stehen und verwendet werden können. Darüber hinaus machen es viele Pakete zur Richtlinie, beim Erstellen und Zugreifen auf Beziehungen, die nicht vorhanden sind, immer Anführungszeichen in Anführungszeichen zu verwenden vollständig klein geschrieben, z. B. PGAdmin III.

Dies ist beispielsweise das Skript, das von PGAdmin III beim Erstellen einer Tabelle über die Benutzeroberfläche generiert wird:

    CREATE TABLE public."TBLUSER"
    (
      username text
    ) 
    WITH (
      OIDS = FALSE
    )
    ;

Daher kann ein Benutzer in einer Abfrage nur auf diese Tabelle zugreifen, indem er sich auf den angegebenen Bezeichner bezieht, d "TBLUSER". H. Der Versuch, in einer Abfrage mit einem nicht in Anführungszeichen gesetzten Bezeichner auf diese Tabelle zuzugreifen, führt dazu, dass die Beziehung nicht gefunden werden kann, d TBLUSER. H.

efesar
quelle
Kommentare sind nicht für eine ausführliche Diskussion gedacht. Dieses Gespräch wurde in den Chat verschoben .
Paul White 9