Які дійсні формати імені схеми PostgreSQL?


14

Я не можу знайти документацію, яка описує дійсні формати імені схеми PostgreSQL. Я знаю, що назва схеми не може:

  • Почніть з числа
  • мати пробіли
  • починати з pg_

Що ще? Куди мені шукати?

Відповіді:


17

Згідно з тонкою документацією , я думаю, це може бути те, що ви шукаєте.

Ідентифікатори SQL та ключові слова повинні починатися з літери (az, але також букв із діакритичними позначками та не латинськими літерами) або підкреслення (_). Наступними символами в ідентифікаторі або ключовому слові можуть бути літери, підкреслення, цифри (0-9) або знаки долара ($). Зауважте, що знаки долара не дозволяються в ідентифікаторах відповідно до букви стандарту SQL, тому їх використання може зробити програми менш портативними ...


Спасибі. Я буду дотримуватися цих інструкцій і побачити, чи це дійсні назви схем. Якщо так, то я прийму це.

Може хочете додати pg_підкреслення в зв'язку з цим, як Nathan C згадано .
Рамон Таяг

5

Згідно з документацією , вона також не може починатися з pg_того, що зарезервовано. Крім цього, це виглядає досить вільно.


Дякую, я додам це до списку того, що схеми не можна назвати. На жаль, це не єдине правило, мабуть. Я міг би назвати це, this-is schemaі все одно це буде невірним ім'ям схеми.

3
@Ramon: це схема -це чи це-є дійсними іменами схем, строго кажучи. Ви , здається, плутає то , що діє з коли воно повинно бути укладено в лапки .
Даніель Веріте

Так, ви, мабуть, праві. Дозвольте мені розібратися в цьому.
Рамон Таяг

3

Правильна відповідь - це та, яку надають gsiems. Однак хочу зазначити, що PostgreSQL має правила щодо котируваних ідентифікаторів, які ви можете пам’ятати. "Котирувані ідентифікатори можуть містити будь-який символ, крім символу з кодом нуля. (Щоб включити подвійну лапочку, напишіть дві подвійні лапки.)" ... Існують також деякі обмеження на випадок, який ви хочете подивитися.

Тож якщо ви збираєтесь цитувати свої ідентифікатори, то ви можете використовувати будь-який символ, який ви хочете (за винятком \ 0). Але якщо ви не цитуєте своїх ідентифікаторів, ви повинні дотримуватися правил, викладених на цій сторінці.

Я хотів би вказати на це головним чином тому, що раніше мене покусало, особливо правила, що стосуються випадку в нецитованих ідентифікаторах (а назви схем вважаються ідентифікаторами).

ОНОВЛЕННЯ:

Як приклад (не застосовується спеціально до ідентифікаторів схем, але однаково застосовно до них):

    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

Це може бути очікуваною поведінкою для тих, хто має досвід PostgreSQL (і, можливо, стандартів SQL), але хтось, хто не знайомий з PG і з точки зору інших серверів баз даних (наприклад, SQL Server або Oracle), може натрапити на цю поведінку і цікаво, чому таблиця, яку вони тільки що створили, відсутня.

Можливо, деякі посібники рекомендують забороняти використовувати котирувані ідентифікатори, але справа в тому, що цитовані ідентифікатори доступні для використання та можуть бути використані. Крім того, багато пакунків передбачають політику завжди використовувати котирувані ідентифікатори під час створення та доступу до відносин, які не є повністю малі, наприклад, PGAdmin III.

Наприклад, це сценарій, створений PGAdmin III при створенні таблиці через інтерфейс користувача:

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

Отже, єдиний спосіб, коли користувач може отримати доступ до цієї таблиці в запиті, - звернувшись до свого котируваного ідентифікатора, тобто "TBLUSER". Спроба отримати доступ до цієї таблиці у запиті з нецитованим ідентифікатором призведе до невдалого пошуку відношення, тобто TBLUSER.


Коментарі не для розширеного обговорення; ця розмова була переміщена до чату .
Пол Білий 9
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.