Quali sono i formati validi di un nome di schema PostgreSQL?


14

Non riesco a trovare la documentazione che descriva i formati validi di un nome di schema PostgreSQL. So che un nome di schema non può:

  • inizia con un numero
  • avere spazi
  • iniziare con pg_

Cos'altro? Dove dovrei guardare?

Risposte:


17

Secondo l'ottima documentazione , penso che questo potrebbe essere quello che stai cercando.

Gli identificatori SQL e le parole chiave devono iniziare con una lettera (az, ma anche lettere con segni diacritici e lettere non latine) o un trattino basso (_). I caratteri successivi in ​​un identificatore o parola chiave possono essere lettere, caratteri di sottolineatura, cifre (0-9) o segni di dollaro ($). Nota che i simboli di dollaro non sono consentiti negli identificatori secondo la lettera dello standard SQL, quindi il loro uso potrebbe rendere le applicazioni meno portatili ...


Grazie. Seguirò queste istruzioni e vedrò se quelli sono nomi di schemi validi. Se è così, allora accetterò questo.

Potrebbe voler aggiungere pg_sottolineatura a questo link, come Nathan C menzionato .
Ramon Tayag,

5

Secondo la documentazione , inoltre, non può iniziare pg_perché è riservato. A parte questo sembra abbastanza libero.


Grazie lo aggiungerò all'elenco di quali schemi non possono essere nominati. Sfortunatamente, non è l'unica regola, a quanto pare. Potrei nominarlo this-is schemae sarebbe comunque un nome di schema non valido.

3
@Ramon: questo-è o questo-è schema sono nomi di schema validi, a rigor di termini. Sembra che tu stia confondendo ciò che è valido con cui deve essere citato .
Daniel Vérité,

Sì, probabilmente hai ragione. Vorrei esaminare questo.
Ramon Tayag,

3

La risposta corretta è quella fornita da gsiems. Tuttavia, desidero sottolineare che PostgreSQL ha delle regole sugli identificatori tra virgolette che potresti tenere a mente. "Gli identificatori tra virgolette possono contenere qualsiasi carattere, tranne il carattere con codice zero. (Per includere una virgoletta doppia, scrivi due virgolette doppie.)" ... Ci sono anche alcune restrizioni sul caso che potresti voler esaminare.

Quindi, se hai intenzione di citare i tuoi identificatori, puoi usare qualsiasi carattere tu voglia (ad eccezione di \ 0). Ma se non stai citando i tuoi identificatori, devi seguire le regole descritte in quella pagina.

Volevo evidenziarlo principalmente perché mi ha morso prima, in particolare le regole relative al caso negli identificatori non quotati (e i nomi degli schemi contano come identificatori).

AGGIORNARE:

Ad esempio (non specificamente applicabile agli identificatori di schemi, ma ugualmente applicabile a loro):

    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

Questo potrebbe essere un comportamento previsto per coloro che hanno esperienza con PostgreSQL (e forse gli standard SQL), ma qualcuno che è nuovo su PG e proveniente dal punto di vista di altri server di database (ad esempio SQL Server o Oracle) potrebbe imbattersi in questo comportamento e mi chiedo perché manchi la tabella che hanno appena creato.

Forse alcuni manuali sconsigliano l'uso di identificatori tra virgolette, ma il fatto è che gli identificativi tra virgolette sono disponibili per l'uso e possono essere usati e inoltre, molti pacchetti lo rendono una politica per usare sempre identificatori tra virgolette durante la creazione e l'accesso a relazioni che non lo sono interamente in minuscolo, ad es. PGAdmin III.

Ad esempio, questo è lo script generato da PGAdmin III durante la creazione di una tabella tramite l'interfaccia utente:

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

Pertanto, l'unico modo in cui un utente può accedere a questa tabella in una query è facendo riferimento al suo identificatore tra virgolette, ovvero "TBLUSER". Tentare di accedere a questa tabella in una query con un identificatore non quotato comporterà la mancata individuazione della relazione, ad es TBLUSER.


I commenti non sono per una discussione estesa; questa conversazione è stata spostata in chat .
Paul White 9
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.