Sensibilité À La Casse Postgres

J'ai importé 100 tables dans Postgres à partir de MSSQL server 2008 via un outil qui a créé toutes les tables avec leurs colonnes dans majuscule . Maintenant, si je veux faire une vue de données à partir de la table par exemple-STD_TYPE_CODES as -

select * from STD_TYPE_CODES

Je reçois une erreur suivante -

ERROR:  relation "std_type_codes" does not exist
LINE 1: select * from STD_TYPE_CODES
                  ^
********** Error **********
ERROR: relation "std_type_codes" does not exist
SQL state: 42P01
Character: 15

Je sais que je peux mettre les guillemets autour du nom de la table comme -

select * from "STD_TYPE_CODES"

Mais comme j'ai travaillé avec MSSQL Server, il n'y a pas ce genre de problème. Donc, est-il possible de se débarrasser de cette? S'il vous plaît aider.

23
demandé sur Milen A. Radev 2014-02-15 14:46:40

1 réponses

A_horse_with_no_name a raison.

Dans PostgreSQL, les noms non cités sont insensibles à la casse. Donc SELECT * FROM hello et SELECT * FROM HELLO sont équivalents.

Cependant, les noms cités sont sensibles à la casse. SELECT * FROM "hello" est pas équivalent à SELECT * FROM "HELLO".

Pour faire un "pont" entre les noms cités et les noms non cités, les noms non cités sont implicitement en minuscules, ainsi hello, HELLO et {[6] } sont équivalents à "hello", mais pas à "HELLO" ou "HeLLo" (Oups!).

Ainsi, lors de la création d'entités (tables, vues, procédures, etc.) dans PostgreSQL, vous devez les spécifier soit sans guillemets, soit entre guillemets mais en minuscules.


Pour convertir des tables/vues / etc existantes, vous pouvez utiliser quelque chose comme ALTER TABLE "FOO" RENAME TO "foo".

Ou, essayez de modifier dump à partir de MSSQL pour le rendre "PostgreSQL-compatible" (de sorte qu'il contiendra foo S ou "foo"s mais pas "FOO" s).

  • soit en éditant explicitement le fichier de vidage. (Si vous utilisez Linux, vous pouvez faire sed -r 's/"[^"]+"/\L\0/g' dumpfile - cependant, soyez averti que cette commande peut modifiez également le texte dans les littéraux de chaîne.)
  • ou en spécifiant certaines options lors de l'obtention du dump à partir de MSSQL. (Je ne suis pas sûr s'il y a de telles options dans MSSQL, Je ne l'ai jamais utilisé, mais probablement de telles options devraient exister.)
37
répondu Sasha 2017-01-03 08:06:46