web-dev-qa-db-fra.com

Sensibilité à la casse Postgres

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

select * from STD_TYPE_CODES

Je reçois une erreur-

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

select * from "STD_TYPE_CODES"

Mais comme j'ai travaillé avec MSSql Server, il n'y a pas ce genre de problème. Y a-t-il un moyen de s'en débarrasser? Veuillez aider.

31
Viks

Dans PostgreSQL, les noms non cités ne sont pas sensibles à la casse. Ainsi 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 entre guillemets et les noms sans guillemets, les noms sans guillemets sont implicitement en minuscules, donc hello, HELLO et HeLLo sont équivalents à "hello", mais pas à "HELLO" ou "HeLLo" (OOPS!).

Ainsi, lors de la création d'entités (tables, vues, procédures, etc.) dans PostgreSQL, vous devez les spécifier sans guillemets ou 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 le vidage de MSSQL pour le rendre "compatible PostgreSQL" (afin qu'il contienne foos ou "foo"s mais pas "FOO"s).

  • Soit en modifiant 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 également modifier le texte dans les littéraux de chaîne.)
  • Ou en spécifiant certaines options lors de l'obtention de vidage à partir de MSSQL. (Je ne sais pas s'il existe de telles options dans MSSQL, ne l'avez jamais utilisé, mais probablement de telles options devraient exister.)
55
Sasha

La solution ci-dessus fonctionne également pour pg_dump sur Debian Stretch. Finalement compris qu'il est similaire à la façon dont vous le faites dans la ligne de commande de psql:

   pg_dump -d myDatabaseName -t \"myTableName\" > myDumped.sql

Cela ne fonctionnera pas avec des guillemets simples après les barres obliques inverses, comme cela ne fonctionnera pas à l'invite psql>.

0
Eamonn Kenny