Vous n'êtes pas identifié(e).

#151 Re : Général » Méthode de chargement de fichiers à plat (sans séparateur) (Conseil) » 14/11/2018 18:08:24

Si le fichier d'origine a une ligne par enregistrement, il pourrait être importé tel quel dans une table mono-colonne et ensuite inséré dans la table finale par une requête qui connaît la taille des champs et qui découpe les lignes avec des SUBSTR(ligne, début, longueur)
du style:

iNSERT INTO table_finale
   SELECT substr(ligne, 1, 10), substr(ligne, 11, 15), ...
     FROM table_intermediaire;

La table intermédiaire peut être créée en TEMPORARY ou au pire UNLOGGED pour accélérer l'import (pas de journalisation)

#152 Site PostgreSQL.fr » Le forum est resté à l'heure d'été » 14/11/2018 18:01:47

dverite
Réponses : 2

Les messages sur le forum ont une heure d'avance, il me semble que c'est depuis le passage à l'heure d'hiver?

#153 Re : Général » Ajout de colonne dans une table avant une autre » 08/11/2018 16:13:58

La première chose à faire, c'est de prendre connaissance des échanges que les développeurs PostgreSQL ont déjà eu sur ce sujet, pour évaluer la difficulté du problème. Il y a pas mal d'explications ici:
https://wiki.postgresql.org/wiki/Alter_column_position
(dont une bonne partie est "comment s'en passer", mais voir les liens à la fin de la page sur les discussions de "comment l'implémenter").


Il y a également cette discussion qui se réfère à un patch mais j'ai l'impression jamais envoyé (?):
https://www.postgresql.org/message-id/f … .gmail.com

Ca date de 2006-2007, mais il y a des chances que le problème principal posé par cette fonctionnalité soit le même aujourd'hui.
En version courte, le problème est qu'en interne Postgres se réfère à la position des colonnes dans la table en tant que clef primaire (attrelid, attnum), de telle manière que "décaler" ces positions remettrait en question un point de conception.
D'ailleurs une colonne supprimée garde son emplacement, elle n'est pas supprimée physiquement dans la couche de stockage.

La question qui se posera sur une remise en question de ce point de conception, c'est est-ce que ça vaut le coup? Les développeurs de Postgres font parfois des changements de conception importants, mais dans des cas où le retour sur investissement attendu est très significatif, comme par exemple le parallélisme intra-requête introduit par la version 9.6.

#154 Re : Général » Se prémunir des injections SQL » 07/11/2018 17:49:57

Bref, j'ai vu qu'en fonction de certains langage, il était possible de faire des requêtes paramétrées.

Dans WinDev aussi visiblement. Si je cherche "windev requêtes sql paramétrées" dans google et le 1er résultat est:
https://doc.pcsoft.fr/?2032050

avec ce style d'exemple:

SELECT * FROM CLIENT WHERE NOM = {Param1} AND PRENOM = {Param2}

HExécuteRequête(REQ_Clients_nom_prénom, hRequêteDéfaut, ...
"Dupond", "Jean")


Si vous ne voulez pas utiliser le système de Windev, il faut effectivement faire votre propre fonction d'échappement, l'équivalent du PQescapeLiteral () de la bibliothèque libpq (en C), ou du quote_literal() côté serveur.

Vous avez raison de remarquer que EXECUTE(paramètres) présente exactement  le même risque qu'appeler une requête non préparée avec les mêmes paramètres. L'affirmation que requête préparée = protection contre les injections SQL est une sur-simplification. En réalité, si on utilise mal les requêtes préparées on est tout aussi vulnérable, et à l'inverse si on construit sa requête SQL avec des paramètres injectés mais en respectant à 100% les règles de syntaxe, il y a zéro risque avec les entrées malveillantes.

#155 Re : Général » Impossible de mettre un LOCK TABLE ou un SELECT FOR UPDATE » 26/10/2018 14:41:36

A titre de test, j'ai essayé de me connecter avec 2 utilisateurs différents (avec le privilège LOGIN) pour vérifier si les verrous sont appliqués en fonction du current_user ou du session_user

On peut vous donner tout de suite la réponse: ce lien entre utilisateur et verrouillage est une mauvaise direction.
Le verrouillage et les exclusions qui s'ensuivent s'entendent entre transactions.

Deux transactions concurrentes sont forcément dans des sessions différentes, mais qu'elles soient ouvertes par le même login ou pas n'a pas d'importance particulière par rapport à toutes les questions relatives aux verrous.

Un autre fait structurant important est que les verrous acquis dans une transaction sont libérés automatiquement à la fin de la transaction, et ne peuvent pas être libérés avant.

#156 Re : Général » Erreur : "FATAL: authentification peer échouée pour l'utilisateur" » 25/10/2018 11:17:54

faut-il pour chaque utilisateur sa base pour se connecter

Non pas spécialement. Quand on lance psql sans l'option -d pour désigner une base, il utilise par défaut le nom de l'utilisateur Unix comme nom de base. Pareil pour -U d'ailleurs. C'est le seul lien entre nom d'utilisateur et nom de base.

#157 Re : Installation » Problème installation Postgre Windows 10 » 24/10/2018 16:44:27

Une recherche rapide semble indiquer que "PEM" veut dire Postgres Enterprise Manager
dont l'installation est documentée ici
https://www.enterprisedb.com/fr/docs/en … ide-07.htm

D'après cette doc PEM contient de nombreux composants en plus de PostgreSQL. Par ailleurs
ça semble être un logiciel propriétaire avec une license d'essai de 60 jours.

Si vous voulez juste PostgreSQL sur Windows, n'installez pas PEM, mais plutôt ce qui est référencé à partir d'ici:

https://www.postgresql.org/download/windows/

#158 Re : Général » Erreur : "FATAL: authentification peer échouée pour l'utilisateur" » 22/10/2018 18:17:48

Le pg_hba.conf par défaut est fait pour avoir un niveau de sécurité raisonnable par défaut.
C'est pourquoi il faut être utilisateur postgres sous Unix pour se connecter sans mot de passe en tant qu'utilisateur de BDD du même nom.

Si vous voulez que n'importe quel utilisateur Unix puisse se connecter avec psql -U postgres
sans mot de passe, remplacer le champ METHOD (le plus à droite) sur cette règle:

local   all             all                                     peer

par celle-là:

local   all             all                                     trust

Si vous voulez la même chose mais avec un mot de passe, utiliser comme méthode md5 et non trust.


Pour les connexions via -h localhost, c'est la ligne d'après qui est à modifier:

host    all             all             127.0.0.1/32            ident

Toutes les lignes du pg_hba.conf sont interprétées dans l'ordre comme si c'était un IF ligne1 ... ELSIF ligne2.. ELSIF ligne3.. ELSIF..

Il faut aussi faire un reload du service pour que les changements de pg_hba.conf soient pris en compte.

#159 Re : Sécurité » Droits sur tous les schémas d'une base de données » 19/10/2018 19:41:45

L'exécution du script sous psql donne ça, pour la partie qui créé puis utilise des tables:

tst=> SET ROLE u1;
SET
tst=> CREATE TABLE s.test1(txt text);
CREATE TABLE
tst=> INSERT INTO s.test1 values('je suis u1');
INSERT 0 1
tst=> 
tst=> SET ROLE u2;
SET
tst=> SELECT * FROM s.test1;
    txt     
------------
 je suis u1
(1 row)

tst=> INSERT INTO s.test1 values('je suis u2 et je ne peux pas écrire dans test1');
ERROR:  permission denied for relation test1
tst=> 
tst=> SET ROLE u3;
SET
tst=> CREATE TABLE s.test3(txt text);
CREATE TABLE
tst=> INSERT INTO s.test3 values('je suis u3 avec ma table s.test3');
INSERT 0 1
tst=> 
tst=> SET ROLE u1;
SET
tst=> SELECT * FROM s.test1;
    txt     
------------
 je suis u1
(1 row)

tst=> SELECT * FROM s.test3;
               txt                
----------------------------------
 je suis u3 avec ma table s.test3
(1 row)

L'INSERT qui est rejeté pour cause de pas de permission montre justement que l'utilisateur u2 ne peut
pas écrire dans la table qui appartient à u1 (en revanche il peut la lire). C'est celui-là:

tst=> INSERT INTO s.test1 values('je suis u2 et je ne peux pas écrire dans test1');
ERROR:  permission denied for relation test1

Or c'est le comportement voulu  tel que décrit plus haut dans la discussion:

Je voudrais que l'utilisateur créateur d'une table ait tous les droits sur celle-ci et uniquement les droits de lecture sur les tables créées par les autres utilisateurs

"Uniquement les droits de lecture", ça veut dire qu'une tentative d'écriture doit être rejetée, et c'est bien ce qui se passe.

#160 Re : Sécurité » Droits sur tous les schémas d'une base de données » 19/10/2018 13:58:18

votre proposition "ALTER DEFAULT PRIVILEGES in SCHEMA nomduschema GRANT SELECT ON TABLES TO read_only" fonctionne pour l'utilisateur courant qui cède le droit (grantor). Du coup quand c'est l'autre utilisateur du schéma qui crée la table le droit select n'est plus affecté;

Oui mais l'autre utilisateur est courant dans sa session au moment où il créé la table donc je ne comprends pas pourquoi cette opposition entre l'utilisateur courant et l'autre utilisateur poserait problème ici, c'est juste une inversion de point de vue.


Voici un script d'exemple  exécutable dans une base initialement vide qui illustre ma réponse plus haut. Il y a 3 utilisateurs, un schéma, un rôle read only. Les utilisateurs créent des tables, les autres les lisent mais ne peuvent pas écrire dedans.

SET ROLE postgres;

CREATE USER u1;
CREATE USER u2;
CREATE USER u3;
CREATE ROLE read_only;

GRANT read_only to u1,u2,u3;

CREATE SCHEMA s;
GRANT USAGE,CREATE ON schema s to u1,u2,u3;

SET ROLE u1;
ALTER DEFAULT PRIVILEGES in SCHEMA s GRANT SELECT ON TABLES
TO read_only;

SET ROLE u2;
ALTER DEFAULT PRIVILEGES in SCHEMA s GRANT SELECT ON TABLES
TO read_only;

SET ROLE u3;
ALTER DEFAULT PRIVILEGES in SCHEMA s GRANT SELECT ON TABLES
TO read_only;


SET ROLE u1;
CREATE TABLE s.test1(txt text);
INSERT INTO s.test1 values('je suis u1');

SET ROLE u2;
SELECT * FROM s.test1;
INSERT INTO s.test1 values('je suis u2 et je ne peux pas écrire dans test1');

SET ROLE u3;
CREATE TABLE s.test3(txt text);
INSERT INTO s.test3 values('je suis u3 avec ma table s.test3');

SET ROLE u1;
SELECT * FROM s.test1;
SELECT * FROM s.test3;

#161 Re : Sécurité » Droits sur tous les schémas d'une base de données » 19/10/2018 13:30:12

Pour l'erreur de syntaxe, le corps du bloc DO doit être dans une chaîne de caractères. La syntaxe complète copier-collable dans une fenêtre SQL doit être

DO $$
DECLARE
  s text;
BEGIN
 FOR s IN SELECT schema_name FROM information_schema.schemata
 LOOP
   EXECUTE format('GRANT USAGE ON SCHEMA %I TO sig_bassee', s);
 END LOOP;
END;
$$ language plpgsql;

sachant que $$ peut être remplacé par $body$ ou $âutrechose$ si le corps du code utilise déjà ce séparateur.

#162 Re : Sécurité » Droits sur tous les schémas d'une base de données » 18/10/2018 13:39:09

Je voudrais que l'utilisateur créateur d'une table ait tous les droits sur celle-ci

C'est le comportement de base, rien de spécial à faire.

uniquement les droits de lecture sur les tables créées par les autres utilisateurs

Le plus simple est de les donner explicitement: après avoir créé une table, un utilisateur doit faire

GRANT SELECT ON nouvelletable TO user_read;

Ou bien il le fait une fois pour toutes, si ça concerne toutes ses créations, avec

ALTER DEFAULT PRIVILEGES in SCHEMA nomduschema GRANT SELECT ON TABLES TO read_only;

Il est aussi possible de passer provisoirement à un autre utilisateur (si on a le droit) en faisant

SET ROLE username;

et

RESET ROLE;

pour revenir à celui du départ, ce qui permet notamment à un superutilisateur de scripter des commandes en lieu et place de l'utilisateur en question.

#163 Re : Sécurité » Droits sur tous les schémas d'une base de données » 18/10/2018 13:16:09

Il faut boucler sur le résultat d'une requête listant les schémas concernés, et il faut déclarer explicitement une variable pour ça.

DO
DECLARE
  s text;
BEGIN
 FOR s IN SELECT schema_name FROM information_schema.schemata
 LOOP
   EXECUTE format('GRANT USAGE ON SCHEMA %I TO sig_bassee', s);
 END LOOP;
END;

#164 Re : Général » déinstallation postgresql sous ubunto » 18/10/2018 13:02:20

Sans supprimer les données:

sudo dpkg --remove postgresql-9.1

En supprimant les données:

sudo dpkg --remove --purge postgresql-9.1

#165 Re : Sécurité » Droits sur tous les schémas d'une base de données » 12/10/2018 16:58:23

Il est assez facile généralement de scripter ces ordres GRANT. Les schémas existants peuvent être listés via la table système  pg_namespace ou la vue information_schema.schemata qui est plus sélective.

Avec un psql récent (9.6) on peut écrire quelque chose du style:

 SELECT format('GRANT USAGE ON SCHEMA %I TO nom_du_role', schema_name)
    FROM information_schema.schemata \gexec

Le SELECT va générer les ordres de GRANT, et \gexec va directement exécuter ces ordres sans qu'il y ait besoin de plus de code.
On peut remplacer \gexec  par \g pour voir les requêtes sans les exécuter dans la phase de mise au point.


Le faire en plpgsql est un peu plus compliqué mais pas bien méchant non plus: dans un bloc DO, un EXECUTE pour chaque GRANT généré à l'intérieur d'un LOOP sur la requête de sélection de schémas.

#166 Re : Sécurité » Droits sur tous les schémas d'une base de données » 12/10/2018 14:01:55

Pour 1), si c'est pour de futures créations, à partir de la version 10 on peut faire:

ALTER DEFAULT PRIVILEGES GRANT usage ON schemas TO nom_du_role;

Pour 2) on peut faire, sur toutes versions il me semble:

ALTER DEFAULT PRIVILEGES GRANT ... ON tables TO nom_du_role;

Si c'est pour des tables pré-existantes je pense qu'il faut faire pour chaque schéma:

GRANT ... ON ALL TABLES IN SCHEMA nom_schema TO nom_du_role;

#167 Re : Général » Passage de paramètre dynamique dans le Crosstab? » 09/10/2018 16:49:09

Le ORDER BY n'a pas le droit d'être à cette place (dans la clause where), et la partie $$ OR $$ ,$P{Customer_ID} IS NULL , $$ doit aussi être découpée pour que $P{Customer_ID}  soit tout seul en dehors de la chaîne de caractères.

Ce qui serait intéressant c'est d'avoir toute la requête telle qu'elle arrive à postgres, elle doit être dans le log postgresql si elle n'est pas dans le message d'erreur.

#168 Re : Général » Passage de paramètre dynamique dans le Crosstab? » 09/10/2018 15:51:21

Mais quelle est l'erreur qui se produit avec la combinaison OR....AND ? C'est une erreur de syntaxe ou c'est pas le bon résultat?
Quel est le message d'erreur s'il y en a un?

Si c'est syntaxiquement correct il doit manquer des parenthèses puisque le AND précède le OR dans l'ordre d'évaluation.

#169 Re : Général » Passage de paramètre dynamique dans le Crosstab? » 09/10/2018 13:52:47

Le problème est que si $P{Customer_ID} se présente comme une chaîne vide, le résultat SQL va ressembler à
...Customer_ID = OR IS NULL...
ce qui est syntaxiquement doublement faux du point de vue de l'interpréteur SQL.

Mais est-ce que c'est ça qui se produit? Par quoi exactement $P{Customer_ID}  est remplacé?
Par '' (chaîne vide mais litéral SQL valide)?
Par rien du tout?
Par le mot-clef NULL?

#170 Re : Site PostgreSQL.fr » databasename\r » 05/10/2018 15:54:39

\r peut être un retour chariot (code 13) exprimé en séquence d'échappement. En fait le nom de la base serait comptable_1 suivi du caractère de code 13. Pour savoir comment/pourquoi c'est arrivé il faudrait analyser avec quelle méthode/outil cette table a été créée.


C'est vérifiable avec une requête:

select c, ascii(c) from 
 (select regexp_split_to_table(datname, '') as c 
 from pg_database where datname like 'comptable\_1%') s;

Cette requête sort chaque caractère du nom de la base séparément avec son code.

Si le dernier caractère est bien le code 13, on pourrait utiliser par exemple la syntaxe unicode suivante pour  supprimer la base:

DROP DATABASE U&"comptable_1\000d";

ou la renommer

ALTER DATABASE U&"comptable_1\000d" RENAME TO "autre_nom";

000d étant le code Unicode hexa correspondant à 13.

Voir la doc https://docs.postgresql.fr/10/sql-syntax.html

#171 Re : Optimisation » surveillance de base de données postgresql » 03/10/2018 14:12:06

Il y en a pas mal. Les dédiés:

https://wiki.postgresql.org/wiki/Monito … _solutions


Beaucoup d'outils de surveillance génériques ont aussi des plugins PostgreSQL:

https://wiki.postgresql.org/wiki/Monito … th_plugins


Voir aussi une présentation de 2016 en français à ce sujet:
http://blog.taadeem.net/french/2016/04/ … PostgreSQL

#172 Re : Général » Suivi Restauration d'un dump » 02/10/2018 17:07:10

La restauration du dump consiste à exécuter des requêtes, qui sont visibles via pg_stat_activity comme n'importe quelle autre requête.


A moins que l'option --single-transaction de pg_restore soit utilisée, chaque requête est commitée immédiatement donc ses effets sont aussi visibles de l'extérieur via une autre session.


Sur unix on peut aussi utiliser la commande pv pour savoir à quel point en est la lecture des données en entrée. Mais ce n'est  pas nécessairement proportionnel à la durée d'import, parce que les CREATE INDEX, qui ne pèsent rien dans le flux de données, peuvent consommer beaucoup de temps d'exécution.

#173 Re : pgAdmin4 » Création de serveur sous pg admin 4 (suite) » 02/10/2018 16:49:53

Je suis technicien SIG et je veux qu'un collègue de bureau (appelons le Bernard) puisse se connecter à la BD avec pg admin et depuis QGIS. Je n'y arrive pas.
Je me suis renseignée et ai compris (sans doute) que tout devaient se passer autour des fichiers postgresSQL.conf, pg_hba.conf.

Un élément essentiel pour configurer ça est l'origine de la connexion. Cet utilisateur distant doit pouvoir se connecter à partir d'où, et est-ce que l'entreprise/organisation où se trouve votre PC autorise effectivement les connexions vers votre PC depuis cet extérieur? Si cet extérieur est "tout l'Internet" généralement la réponse à la 2eme question est Non, parce que la réponse Oui est très problématique pour la sécurité.

Doit-on créer "Bernard" dans Pg admin via "Login/group roles, et paramétrer des choses (dans paramètres, privileges...) ?

C'est un choix à faire. Soit vous communiquez à l'autre utilisateur un login déjà existant, celui que vous utilisez vous-même, ce qui simplifie beaucoup les choses mais lui donne les mêmes droits que vous. Soit il a un login personnel mais il faudra dans ce cas gérer ses droits d'accès aux objets en base avec des commandes GRANT, ce qui peut être assez fastidieux.

#174 Re : Général » installation postgresql sous centos » 27/09/2018 16:54:25

La nécessité ou pas de cette commande dépend du contexte.

S'il y a d'autres règles iptables qui rejettent toute connexion entrante par défaut, alors oui ajouter cette règle est nécessaire.
Il est aussi possible qu'il faille ajouter une règle sur la chaîne OUTPUT car les paquets réseau doivent passer dans les deux directions.

#175 Re : Optimisation » Optimisation des ressources système » 25/09/2018 16:20:48

Personnellement j'essaierais avec beaucoup plus de swap, au moins 2 fois la RAM, soit 64GB.

Un swap trop faible fait que le noyau ne peut pas décharger les pages qui ne lui servent pas dans l'immédiat. Du coup il est obligé de swapper plus fréquemment, ce qui aggrave le problème du point de vue de l'utilisateur.


Un autre aspect du problème est que la consommation de RAM dépend des requêtes. Certaines requêtes peuvent être gourmandes. En principe les opérations de jointure, hachage etc...sont capables d'écrire des données temporaires sur disque quand work_mem est dépassé. Mais il peut aussi se tromper dans l'estimation de la mémoire nécessaire et allouer beaucoup plus que prévu. Pour cet aspect-là il faut regarder quelles sont les requêtes en exécution quand les problèmes surviennent et étudier leur conso réelle avec EXPLAIN ANALYZE (commencer peut-être par auto_explain).

Pied de page des forums

Propulsé par FluxBB