Vous n'êtes pas identifié(e).
C'est vrai autant pour moi, j'utilise une distribution Linux F12, j'ai fais l'installation de PostgreSQL
via le repo pgdg84 en utilisant yum.
- C'est normal qu'il n'y ait même pas de nom d'utilisateur à la chaine de connexion ?
J'ai rajouté un nom d'utilisateur et un mot de passe, mais cela ne change rien.
Ou se trouve le fichier du log des erreurs de PostgreSQL, j'ai regardé dans /var/log et je ne trouve rien!
Bonjour à toutes et à tous,
Ma base de données PostgreSQL est active sur le serveur localhost port 5432, via PHP j'ai conçu
un script permettant de tester la connection au serveur de Base de données.
Je n'arrive pas à me connecter à la Base de données, voici le script PHP permettant de tester
la connection :
--- fichier connection.inc.php ---
<?php
$connection = pg_connect("host=localhost port=5432 dbname=jogstore")
or die ("Nao consegui conectar ao PostGres --> " . pg_last_error($conn));
?>
--- fichier accueil.php ---
<div id="container">
<h5>Fiche article</h5>
<?php include('connection.inc.php');
$result=pg_exec("SELECT COUNT(*) FROM articles;");
$fetch = pg_fetch_row($result);
pg_close($connection);
?>
</div>
Dans l'affichage du fichier accueil.php, j'ai le message Nao consegui conectar ao PostGres -->
La connection ne semble pas se faire ....
Merci d'avance.
Sophonie.
Résolu.
En fait il faut installer le daemon oidentd présent dans le dépôt de Fedora.
Ce démon permet l'identification de l'utilisateur en utilisant le protocole TCP se dernier
utilise le port 113 pour se connecter.
En tant que root :
yum install oidentd
Suite à cette installation je peux me connecter à la Base de données inventaire et récupérer
les données géo-spatial.
Merci encore.
Sophonie.
Avez vous demandé à PostgreSQL de recharger sa configuration après la modification de pg_hba.conf ?
Je suppose qu'il faut arrêter le serveur postgres puis redémarrer ce dernier? Si c'est cela je le fais
automatiquement après chaque modification d'un fichier de conf.
Par ailleurs je vais remettre à ident la valeur dans le fichier pg_hba.
Sophonie.
Bonjour Marc Cousin,
Dans le fichier pg_hba.conf, j'ai modifié la ligne ident par trust mais cela n'a rien changé.
Est-ce ainsi qu'il faut procéder ou doit-on modifier un autre fichier. Car je ne vois pas d'autre
paramètre à modifier.
Merci encore.
Sophonie.
Bonjour à toutes et à tous,
Pré-Requis :
J'ai installé et configurer correctement PostgreSQL ainsi que le module PostGIS puisque j'arrive à me connecter et à créer une Base de données géo-spatial.
Depuis Quantum GIS, je tente de créer une nouvelle connexion pour récupérer les données de géo-référencement dans ma Base de données (qui s'appelle inventaire).
Je saisi les informations suivantes dans la fenêtre de création de connection PostgreSQL :
Name Donnees Inventaire
Host localhost
Database inventaire
Port 5432
Username Joachim
Password
NB : Il n'y a pas de mot de passe puisque depuis un shell Unix je tape psql inventaire et je suis connecté
à la Base de données inventaire.
L'utilisateur joachim est un super-user.
J'ai le message suivant quand je clique sur Test connection:
authentification Indent échoué pour l'utilisateur joachim
Merci d'avance.
Sophonie.
Etant donné que des tuples sont déjà présents, je continuerai avec cette "coquille"
Je ne continuerai pas avec cette coquille, car les problèmes se représenteront par la suite
ultérieurement.
J'ai donc redéfini mon modèle conceptuel des données afin qu'il y ai davantage de cohérence.
Bonne soirée.
Sophonie.
Bonjour Marc Cousin,
Effectivement la phase de conception via la méthode MERISE n'a pas été correctement mis en oeuvre
pour cette relation.
Pour que mon trigger soit opérationnel, il faut que je lui indique de ce déclencher
avant(BEFORE) l'insertion dans la table users au lieu de après(AFTER).
Ce qui donne :
CREATE TRIGGER ajout_auth BEFORE INSERT ON users
Etant donné que des tuples sont déjà présents, je continuerai avec cette "coquille".
Merci encore.
Sophonie.
Bonjour à toutes et à tous,
J'ai crée un trigger permettant d'ajouter automatiquement une ligne dans la table authentification
lors de l'ajout d'un nouvel utilisateur.
Cependant, j'ai un message d'erreur lors de l'execution de la requête INSERT INTO users VALUES ...
Néanmoins voici le script PL/pgSQL permettant un ajout dans la table authentification.
CREATE OR REPLACE FUNCTION ajout_auth() RETURNS trigger AS $ajout_auth$
BEGIN
RAISE NOTICE 'ajout du client en cours ...';
IF (TG_OP = 'INSERT') THEN
INSERT INTO authentification (auth_id, auth_login, auth_passwd, auth_dtecreation, auth_dtelastconnect, auth_actif) VALUES
((SELECT COALESCE (MAX(auth_id),0) + 1 FROM authentification),lower(NEW.user_nom), initcap(NEW.user_prenom), CURRENT_DATE, CURRENT_DATE, true);
RETURN NEW;
END IF;
END;
$ajout_auth$ LANGUAGE plpgsql;
CREATE TRIGGER ajout_auth AFTER INSERT ON users
FOR EACH ROW
EXECUTE PROCEDURE ajout_auth();
Sous psql en exécutant la requête suivante :
INSERT INTO users VALUES ((SELECT COALESCE (MAX(user_id),0) + 1 FROM users), 'DURAND','renaud','1969-04-11','renaud.durand@businessdecision.com','h','9,rue de Condé','','Bordeaux','33000', 1,11,'0556001260');
J'ai le message d'erreur suivant :
ERREUR: une instruction insert ou update sur la table « users » viole la contrainte de clé
étrangère « fk_users_idauth »
DÉTAIL : La clé (user_idauth)=(11) n'est pas présente dans la table « authentification ».
La valeur 11 (champ idauth dans la table user) correspond à l'id que devrait avoir le nouvel utilisateur
ajouté.
Si je ne mets pas 11, qu'elle valeur dois-je mettre?
Merci d'avance.
Sophonie.
Bonjour à toutes et à tous,
J'ai téléchargé le code source ... mais je me rends compte que le
langage de procédure de Postgresql NE permet pas de construire des fonctions de recherche,
remplacement, substitution ... sur les chaînes de caractères.
Il faut passer par une langage comme le Perl, ou le Python en l'implémentant dans le PL du
SGBDR PostgreSQL.
Merci encore.
Sophonie.
Bonjour à toutes et à tous,
Sous un environnement GNU Linux, où se situe les fichiers du code source de PostgreSQL.
En effet, j'aurai souhaité savoir comment à été codé la fonction replace permettant le
remplacement d'une chaîne de caractère par une autre.
Merci d'avance.
Sophonie.
La fonction REVERSE existant sous Oracle, n'existe pas sous PostgreSQL. Il faut donc écrire cette
fonction.
Concernant les remplacements, la fonction REPLACE permet d'effectuer ces opérations.
replace('i', 1) etc ...
Je continue mes recherches.
Sophonie.
Bonjour à toutes et à tous,
N.B : Dans la globalité, j'ai compris comment fonctionne un trigger, et comment l'implémenter.
Ma question est d'un tout autre ordre.
Je souhaite créer un trigger permettant lors de la création d'une personne de créer automatiquement
une entrée dans la table authentification.
Le login sera la prénom de la personne en minuscule : lower(user_nom)
Pour cette partie, je bloque :
Son mot de passe sera son son prénom inversé avec la 1ère et la dernière lettre en majuscule,
et en remplaçant :
i=>1
a=>@
s=>$
l=>£
p=>%
Merci d'avance.
Sophonie.
Bonsoir gleu,
Comme je l'ai souligné dans un précédent post je n'en suis qu'à mes débuts
sous PL/pgSQL donc je commet des erreurs de débutant.
Merci encore.
Sophonie.
Bonjour gleu,
Pourtant il y a des données dans la table users puisqu'un
SELECT * FROM users;
renvoi les 5 records présents dans la table
Sophonie.
Bonjour à toutes et à tous,
Dans le script suivant, mon objectif est de lister l'ensemble de la table users en affichant le nom
en minuscule, le prénom en initcap le tout trié par ordre croissant du nom
CREATE OR REPLACE FUNCTION list_client() RETURNS TABLE(user_nom text, user_prenom text) AS
$$
DECLARE
BEGIN
RETURN QUERY SELECT LOWER(user_nom)nom, UPPER(user_prenom)prenom
FROM users ORDER BY user_nom ASC, user_prenom;
RETURN;
END;
$$ LANGUAGE plpgsql;
Sous psql, en faisant un SELECT * FROM users;
les colonnes user_nom et user_prenom s'affichent mais le contenu des champs est vide (valeur NULL)
Merci d'avance.
Sophonie.
Résolu.
En fait, la variable val déclarée dans la boucle FOR est automatiquement définie avec le type record,
[et existe seulement dans la boucle].
La colonne devant récupérer cette valeur (num3) est de type integer. Donc il faut modifier l'expression
INSERT INTO table3(num3) VALUES(val);
pour que la valeur à l'intérieur de VALUES() puisse être une donnée de type integer.
Ainsi il faut écrire
INSERT INTO table3(num3) VALUES(val.resultat);
resultat étant le nom de la colonne de la table multiplication.
En souhaitant que ce post puisse servir à d'autres.
Bonne journée.
Sophonie.
Bonjour à toutes, et à tous,
Je continue mon extrapolation du langage de procédure de PostgreSQL.
Le but de cet exercice (purement pédagogique) est de récupérer l'ensemble des records
du champ d'une table et de les stocker dans le champ d'une autre table.
J'utilise donc un curseur pour "balayer" tous les tuples, voici mon code
CREATE OR REPLACE FUNCTION stockerLesValeurs() RETURNS INTEGER AS
$$
DECLARE
c_table CURSOR FOR SELECT resultat FROM multiplication;
val table3.num3%TYPE;
BEGIN
FOR val IN c_table LOOP
INSERT INTO table3(num3) VALUES(val);
END LOOP;
RETURN val;
END;
$$ LANGUAGE plpgsql;
Sous psql, j'ai le message suivant dès que j'invoque la fonction stockerLesValeurs()
initiation=# SELECT * FROM stockerlesvaleurs();
ERREUR: la colonne « num3 » est de type integer mais l'expression est de type record
LIGNE 1 : INSERT INTO table3(num3) VALUES( $1 )
^
ASTUCE : Vous devez réécrire l'expression ou lui appliquer une transformation de type.
REQUÊTE : INSERT INTO table3(num3) VALUES( $1 )
CONTEXTE : PL/pgSQL function "stockerlesvaleurs" line 6 at instruction SQL
Je comprends bien qu'il s'agit d'un problème de conversion de type, par contre appliquer une transformation de type à l'expression. Comment procéder à cette opération?
Merci d'avance pour votre aide.
Sophonie.
Bonjour jpargudo,
Votre problème est ici :
SELECT num2 FROM table2 WHERE num2 = val.num1
Si table2 contient des multiples de 12, l'égalité num2= val.num1 sera vraie tous les 12 tuples.
Je viens juste de me repencher sur les exercices en PL/pgSQL (priorités professionnelles) oblige
en fait implicitement vous m'apportiez la réponse, si la table contient des multiples de 12
alors il faut diviser par 12 la valeur récupérée par le curseur, ie num2 = val.num/12
J'attends votre retour pour les exercices d'approfondissement sur PL/pgSQL.
Merci encore.
sophonie.
Bonjour jpargudo,
Tout cela est effectivement à but pédagogique, et aura une finalité professionnelle à terme. Dans un premier temps, je constate que le problème provient de ma requête SQL.
Ce qui témoigne qu'apparemment, j'aurai "plus ou moins" compris le fonctionnement des
curseurs, des types de données, des valeurs retournés par une fonction dans PostgreSQL ...
Je n'en suis qu'à ma première semaine d'autoformation au PL/pgSQL et je souhaite continuer car c'est un langage passionnant avec une documentation riche.
Par contre, j'aurai souhaité savoir si vous disposez d'exercices pratiques sur le langage PL/pgSQL car je veux aller plus loin dans l'extrapolation de ce langage.
En effet, mon administration (un service d'inventaire patrimonial) à un projet de numérisation, de localisation de ses ressources dans une Base de données (j'ai choisi PostgreSQL et PostGIS).
Il nous faudra travailler avec un prestataire de services, en l'occurence Dalibo pour la partie administration du serveur, mais il faut un developpeur sur place (c'est à dire moi).
C'est pour cela que je me penche sur la question concernant ce projet de mise en oeuvre
d'une Base de données PostgreSQL.
Merci d'avance.
Sophonie.
Bonsoir à toutes et à tous,
J'ai crée 2 tables :
table1(num1 INTEGER) table2(num2 INTEGER)
J'ai crée un script PL/pgSQL permettant de stocker dans table1 les nombres de 1 à 100,
et dans table 2 la "table de multiplication par 12" des nombres stockés dans table 1 (les nombres allant de 1 à 100).
J'ai crée une table "multiplication "
multiplication(resultat INTEGER)
Le but de cette table est de stocker la table de multiplication (le produit de chacun des
enregistrements clé par clé) des valeurs des tables table1 et table2.
Pour effectuer cette opération, j'ai utilisé un curseur, voici mon code
CREATE OR REPLACE FUNCTION stockerLesTables() RETURNS SETOF multiplication.resultat%TYPE AS
$$
DECLARE
c_table CURSOR FOR SELECT num1 FROM table1;
val multiplication.resultat%TYPE;
BEGIN
FOR val IN c_table LOOP
INSERT INTO multiplication(resultat) VALUES (val.num1 * (SELECT num2 FROM table2 WHERE num2 = val.num1));
END LOOP;
RETURN NEXT val;
END;
$$ LANGUAGE plpgsql;
Lorsque j'exécute le script SQL en faisant \i monscript.sql tout ce passe bien, de même
que lorsque j'appelle la fonction stockerLesNombres().
Par contre lorsque je fais un SELECT * FROM multiplication;
J'ai bien 100 enregistrements mais seul 8 enregistrements sont récupérés ... les autres
valeurs sont vides.
Merci d'avance.
Sophonie.
RAISE NOTICE 'bonjour nous sommes le %', current_date;
et ça marche.
Bonjour à toutes, et à tous,
Comme l'indique le titre de mon post, je débute avec le le langage de procédure de PostgreSQL.
J'ai lu une partie de la documentation (le strict minimun pour commencer à "mettre les mains dans le cambouis"). J'ai récupéré une série d'exercices afin de débuter en souplesse.
Je reste bloqué sur la première question me demandant de créer un script PL/pgSQL affichant :
Bonjour nous sommes le 22/01/2010.
Il y va de soi qu'il faut afficher la date du jour et pas le 22/01/2010 constamment, voici comment
j'ai procédé :
Je crée un fichier script1.sql via vim
CREATE OR REPLACE FUNCTION bonjour() RETURNS VOID AS
$$
BEGIN
RAISE NOTICE 'Bonjour nous sommes le' || current_date ;
RETURN;
END;
$$ LANGUAGE plpgsql;
Dans psql je fais un \i script1.sql qui m'affiche un message d'erreur
psql:script1.sql:7: ERREUR: erreur de syntaxe sur ou près de « | »
LIGNE 4 : RAISE NOTICE 'Bonjour nous sommes le' || current_date;
Comment se fait-il que je ne puisse pas utiliser l'opérateur || pour concaténer une chaîne de caractère
et la fonction current_date?
Merci d'avance.
Sophonie.
Merci encore.
A bientôt.