PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

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

#1 Re : Général » déclencher une requête à une heure précise chaque jour PostgreSQL » 15/11/2012 12:34:44

Chez nous, avec Ubuntu 12.04 et PG 9.1.6, j'ai un cron job qui tourne toutes les nuits pour nous faire des stats.

Je fais donc comme ceci ...

1. Cron pour lancer un fichier de commandes bash : postgresbatch.sh
    crontab -l
    00 22 * * 1-5 bash /home/xx/pgstuff/prod/scripts/bash/postgresbatch.sh # JOB_ID_1

2. Dans postgresbatch.sh, j'ai ceci
    psql -f '/home/xx/pgstuff/prod/scripts/psql/psql stats batch.psqlb' -a -d pgbase  >'/home/xx/pgstuff/prod/scripts/bash/psql.log' 2>&1
    (qui lance psql avec (-f) un nom de fichier en argument, et stocke l'output de psql dans un fichier log psql.log)

3. Ce fichier  : 'psql stats batch.psqlb' contient des commandes psql comme ceci
    \echo `date`
    \timing
    \i '/home/xx/pgstuff/prod/scripts/psql/requete01.sql'
    \echo `date`

    \i '/home/xx/pgstuff/prod/scripts/psql/requete02.sql'
    \echo `date`

    ...

    \i '/home/xx/pgstuff/prod/scripts/psql/requete99.sql'
    \echo `date`

4. \echo `date` permet de voir la date et l'heure de lancement de chaque requête dans le log et de répérer les fainéants
    \i permet d'exécuter une requête
    \timing ... err... je ne sais plus

5. pour finir, j'ai un alias : alias greperr='grep -i Error /home/xx/pgstuff/prod/scripts/bash/psql.log'
    qui me permet de chercher des erreurs dans le fichier log, rapidos.

Voilà,

"Friendly" ,

Butin

#2 Re : Général » Créer un path à partir d'une base de points » 15/11/2012 10:43:35

Si vous avez des points vous avez sans doute une liste des coordonnées x et y.
Insérer ou importer votre liste dans Excel (ou Open Office Calc (je suppose)) et afficher la liste dans une graphique de type Ligne.
Vous verrez votre path.
Vous aurez peut être besoin d'utiliser l'option Inverser les Axes dans Excel.

Une autre solution ... SVG.
SVG est un format de fichier qui produit des images à partir de données. (Data driven documents)
Chercher dans le manuel online comment décrire un path et, à partir des exemples fournis, copier-coller vos données dans le ficher au bon endroit.
Inkscape (logiciel gratuit) permet d'afficher les fichiers SVG.

Voila,
Butin

#4 Général » Utiliser un backslash dans une fonction PL/PGSQL » 14/11/2012 19:38:01

butin-matou
Réponses : 2

Bonjour,
Comme d'autres avant moi, j'essaie d'ajouter une date au nom de fichier en sortie d'une commande COPY TO ...
J'ai compris qu'il faut passer par une fonction PL/PGSQL...
Ça marche, mais je voudrai que mon fichier soit exporté avec les options
      with csv header     
      NULL AS ''   et
      DELIMITER AS E'\t'  '    ;

Et là, tout marche bien aussi sauf que je n'arrive pas à maîtrise le syntaxe pour le DELIMITER AS E'\t' .
problème de backslash.

Quand je spécifie  DELIMITER AS ''|'', tout fonctionne OK.

Voici une exemple qui fonctionne bien.

set standard_conforming_strings=on;
CREATE OR REPLACE FUNCTION copy_table_to_file(filename TEXT) RETURNS VOID AS
$$
  BEGIN
    EXECUTE 'COPY ma_table TO ''' || filename || '''  with csv header     NULL AS ''''   DELIMITER AS ''|''  '    ;
  END;
$$
LANGUAGE 'plpgsql';

select copy_table_to_file('/home/csvstuff/ma_table_export_' || CURRENT_date::TEXT || '.txt');

A l'aide  SVP pour le bon syntaxe.
Merci,
Butin

#5 Re : Général » Problème d'encoding » 23/09/2011 09:49:20

Bonjour,

Problème résolu.

J'ai redémarré le serveur Postgres
pour recharger la config que j'avais avant le problème (et
avant mes tentatives de correction). Mais le problème persistait.
Je savais au moins que le problème n'était probalement pas du coté serveur.

J'ai vu que les seuls tableaux Excel qui posaient problème
étaient ceux qui utilisaient des champs-contenant-des-accents
définies en dur dans les scripts SQL.
(Surtout des CASE WHEN ...)
Les tableaux qui lisaient directement des champs-de-la-base-contenant-des-accents
s'affichaient correctement.



En creusant, j'ai découvert que mon Notepad++
que j'utilise parfois pour modifier des scripts était règlé,
pour l'encodage, sur "Encoder en ASCII" .
J'ai modifié le paramètre en "Convertir en ASCII", et re-sauvegardé et relancé le script.

Les messages d'erreur ont disparu et l'affichage dans Excel est devenu normal, parfait.

Merci pour toutes vos suggestions.

BM

#6 Général » Problème d'encoding » 20/09/2011 11:08:59

butin-matou
Réponses : 5

Bonjour,

Mon travail se déroule en trois phases.
1. Je developpe et teste des requêtes SQL avec SqlDBX sous Windows.
2. Une tache cron éxécute ces requêtes SQL nuitamment utilisant des batches dans psql.
3. Ces batches créent des tables qui sont visualisables par mes collègues via des TCD dans Excel via ODBC.

Mais j'ai des messages d'erreur avec ce genre de requête :

CASE WHEN ... THEN  'Déséquilibré'
    ELSE 'Equilibré' END     AS Equilibre

Les lettres accentués posent problème.

    Sous Windows avec SqlDBX 3.5.1 :
    ERREUR: séquence d'octets invalide pour l'encodage « UTF8 » : 0xe92720;
    Error while executing the query

    Et avec psql :
    ERREUR:  séquence d'octets invalide pour l'encodage « UTF8 » : 0xe92720

    Dans Excel, pas d'erreur d'accents, puisque la table de résultats n'est pas créée.


Comment faire pour que les lettres accentués français s'enregistrent et se voient correctement ?
        1. dans mon requetteur client (SqlDBX) sous Windows et
        2. dans psql et
        3. dans Excel.

Merci d'avance pour toute aide.

BM
--------------------
pgsama=# \l
                               Liste des bases de données
    Nom    | Propriétaire | Encodage |    Tri     | Type caract. |    Droits d'accès     
-----------+--------------+----------+------------+--------------+-----------------------
pgsama    | postgres     | UTF8     | fr_FR.utf8 | fr_FR.utf8   |
postgres  | postgres     | UTF8     | fr_FR.utf8 | fr_FR.utf8   |
template0 | postgres     | UTF8     | fr_FR.utf8 | fr_FR.utf8   | =c/postgres          +
           |              |          |            |              | postgres=CTc/postgres
template1 | postgres     | UTF8     | fr_FR.utf8 | fr_FR.utf8   | =c/postgres          +
           |              |          |            |              | postgres=CTc/postgres
(4 lignes)

--------------------
Utilisant
Ubuntu 11.04 French
psql 9.0.3
SqlDBX 3.5.1
Win7 Pro French

#8 Re : Sécurité » COPY FROM - access denied » 13/05/2011 17:56:55

Merci Marc,

Quand tu dis "créer un répertoire appartenant à ce groupe",
est-ce je dois comprendre
"modifier le répertoire existant pour qu'il appartienne (désormais) à ce groupe".
puisque mon répertoire existe déjà et la commande chown sert à modifier le propriétaire d'un répertoire existant.

Je n'ai jamais entendu parler du sgid.
Apparement, c'est exactement ce qu'il me faut,
puisque ce sont de nouveaux fichiers qui arrivent chaque nuit.

Merci ben gros.
Je te tiens au courant.

#9 Sécurité » COPY FROM - access denied » 13/05/2011 11:11:09

butin-matou
Réponses : 3

Salut,
Sur Ubuntu, 11,04, postgres 9,03

J'ai une tâche cron qui
    - importe (lftp) des données CSV depuis une machine distante dans un dossier nommé "csvdata" dans ma home group.
    - puis exécute psql pour créer des tables et fait un COPY FROM depuis les fichiers dans le dossier csvdata vers les nouvelles tables.

Quelle est la meilleure façon de refuser l'accès au dossier csvdata (et les fichiers de données) à tous les utilisateurs tout en permettant
l'accès pour moi et pour l'utilisateur postgres.
Le manuel dit que c'est le serveur qui doit avoir accès, mais je ne sais pas comment faire.

Je pensais qu'il serait bien si le dossier pourraient appartenir à un groupe et moi-même et postgres pourraient être membres de ce groupe ... ?
Crazy?

Serait-il préférable (plus simple) d'importer des données dans un dossier où le serveur a déjà des droits d'accès?
Et ce dossier serait-il renommé (ou autrement inaccessible) lors d'un upgrade de postgres?

TIA

butin-matou

#10 Re : Général » Remplir un champ par numérotation automatique » 21/03/2011 17:51:13

Marc Cousin a écrit :

Ça devrait marcher (aux erreurs de syntaxe près, je n'ai pas vérifié smile ). Il y a juste une recopie de trop des données. Vous pourriez directement recopier dans la bonne table cible, plutôt que de recopier deux fois les données, je pense.

Justement, c'est là le problème.
Si je fais le tout "en une seule passe" le nextval('no_serie') est inséré avant le tri.
Du coup, il est lui même trié et perd son sens : il n'est plus du tout serial.

Avec le double recopie, le serial est ajouté après le tri et correspond, dans le cas cité, au row_number().
Je ne suis pas fort en SQL, mais ça à l'air de marcher.

#11 Re : Général » Remplir un champ par numérotation automatique » 21/03/2011 15:47:57

J'ai eu un problème similaire.
Je pense que je l'ai résolu ainsi.
Me gourre-je ?

DROP TABLE IF EXISTS table_b ;
SELECT 
INTO table_b 
FROM table_a
-- Faire le tri dès maintenant
ORDER BY 
	Is_Local_address DESC ,
	UPPER(COUNTRY), 
	UPPER(POSTCODE),
	UPPER(TOWN),
	Name
;
DROP TABLE IF EXISTS table_c;
-- Drop la table avant de dropper la séquence

DROP SEQUENCE IF EXISTS Serial_number;
CREATE SEQUENCE Serial_number;

SELECT 
-- Positionner le Serial N° comme colonne 1 puis ajouter tout le rest (*)
nextval('Serial_number') AS "Serial N°" , * 
INTO table_c
FROM table_b;
;
SELECT * FROM table_c

Pied de page des forums

Propulsé par FluxBB