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 Migration » Comparaison de structure entre deux bases de données » 25/04/2013 15:57:47

charleydc5
Réponses : 3

Bonjour à tous,

J'aimerais savoir si vous connaissez une façon de faire gratuite et efficace pour comparer deux bases de données similaires pour faire ressortir les différences mineures et majeures dans leur structure (tables, champs, types de données, contraintes, etc.)?

Merci beaucoup!

Charles

#2 Re : Général » GRANT sur plusieurs fonctions dans un même script » 15/10/2012 16:24:27

Merci Guillaume

Encore une belle erreur d'inattention.

J'apprécie ton aide.

A+

#3 Re : Général » GRANT sur plusieurs fonctions dans un même script » 15/10/2012 15:08:45

Voici ce que j'essaie de faire depuis un bon bout de temps:

SELECT 	monschema.EXECUTE('GRANT EXECUTE ON monschema.' || p.proname || '(' || pg_catalog.pg_get_function_arguments(p.oid) ||') TO GROUP "grp011_users";') 
FROM pg_catalog.pg_proc p     

LEFT JOIN pg_catalog.pg_namespace n ON 
n.oid = p.pronamespace 

WHERE pg_catalog.pg_function_is_visible(p.oid)      
AND n.nspname <> 'pg_catalog'   
AND n.nspname <> 'information_schema'

Le message d'erreur:

ERROR:  syntax error at or near "("
LINE 1: GRANT EXECUTE ON monschema.unaccent_string(text) TO GROUP "grp01...
                                              ^
QUERY:  GRANT EXECUTE ON monschema.unaccent_string(text) TO GROUP "grp011_users";
CONTEXT:  PL/pgSQL function "execute" line 2 at EXECUTE statement

********** Error **********

ERROR: syntax error at or near "("
SQL state: 42601
Context: PL/pgSQL function "execute" line 2 at EXECUTE statement

Je n'arrive pas à concaténer correctement pour composer la signature de la fonction.

Merci beaucoup pour votre aide

#4 Re : Général » GRANT sur plusieurs fonctions dans un même script » 15/10/2012 15:02:43

Ce que je veux dire, c'est que si je fonctionne de la même façon qu'avec les tables, les séquences, etc... ça ne fonctionne pas car les fonctions ont une signature (les paramètres). Je n'arrive pas à faire en sorte que peu importe la signature le GRANT se fasse correctement.

Je me demandais si quelqu'un ici avait une bonne pratique ou un script déjà fait pour faire un grant sur les fonctions vite fait. Je dois supporter un grand nombre de développeurs donc ce genre de scripts est très utile pour que tout le monde travaille de la même façon, surtout au niveau des permissions sur les bases de données.

Merci

#5 Général » GRANT sur plusieurs fonctions dans un même script » 15/10/2012 14:25:37

charleydc5
Réponses : 5

Bonjour à tous,

J'ai déjà un script que j'utilise pour donner accès à tous les éléments que je désire dans pour une base de données spécifique. Ça fonctionne sur tous les objets de la base de données sauf pour les fonctions où je n'arrive pas à le faire fonctionner.

Voici mon script existant:

En gros on remplace <DATABASE>, <ROLE_NAME> et <SCHEMA> par les bonnes valeurs et on exécute tout simplement.

CREATE OR REPLACE FUNCTION <SCHEMA>.execute(text) 
RETURNS void AS 
 
$BODY$
	BEGIN 
		execute $1; 
	END;
$BODY$ 

LANGUAGE plpgsql;

-- Base de données/Database
GRANT CONNECT, TEMPORARY ON DATABASE <DATABASE> TO GROUP <ROLE_NAME>;

-- Schéma/Schema
GRANT USAGE ON SCHEMA <SCHEMA> TO <ROLE_NAME>;

-- Tables
SELECT 	<SCHEMA>.EXECUTE('GRANT SELECT, INSERT, UPDATE, DELETE, REFERENCES ON TABLE <SCHEMA>.' || relname || ' TO GROUP "<ROLE_NAME>";') 
FROM 	pg_class t, pg_namespace s 
WHERE 	t.relkind = 'r' 
AND 	t.relnamespace = s.oid 
AND 	s.nspname = '<SCHEMA>';

-- Séquences/Sequences
SELECT 	<SCHEMA>.EXECUTE('GRANT SELECT, UPDATE ON <SCHEMA>.' || relname || ' TO GROUP "<ROLE_NAME>";') 
FROM 	pg_class t, pg_namespace s 
WHERE 	t.relkind = 'S'
AND 	t.relnamespace = s.oid 
AND 	s.nspname = '<SCHEMA>';

-- Vues/Views
SELECT 	<SCHEMA>.EXECUTE('GRANT SELECT, UPDATE ON <SCHEMA>.' || relname || ' TO GROUP "<ROLE_NAME>";') 
FROM 	pg_class t, pg_namespace s 
WHERE 	t.relkind = 'v' 
AND 	t.relnamespace = s.oid 
AND 	s.nspname = '<SCHEMA>';

J'aimerais également ajouter un bloc pour supporter les fonctions. Présentement, je dois aller faire les grants pour les fonctions manuellement dans pgAdmin. C'est pas si mal mais j'aimerais mieux avoir un script qui couvre tout.

J'ai trouvé une "solution", mais elle nécessite une intervention supplémentaire:

SELECT 'GRANT ALL ON FUNCTION ' || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || ' (' || pg_get_function_identity_arguments(p.oid) || ') TO john_doe;'
FROM pg_language AS l
JOIN pg_proc AS p
ON p.prolang = l.oid
JOIN pg_namespace AS n
ON p.pronamespace = n.oid
WHERE l.lanname = 'plpgsql'

En gros, cette solution consiste à rouler le script-ci-dessous, et ensuite de copier coller le résultat de la requête pour ensuite l'exécuter séparemment.

Je suppose qu'il doit bien y avoir un moyen de tout faire cela sans une étape supplémentaire?

Merci beaucoup

Charles

#6 Re : Général » Incapable de me connecter à une base de données via pgAdmin » 16/07/2012 16:18:49

Problème résolu. Il manquait d'espace disque sur la partition où les données de PostgreSQL sont placées.

Merci

#7 Général » Incapable de me connecter à une base de données via pgAdmin » 16/07/2012 15:46:01

charleydc5
Réponses : 1

Bonjour à tous,

Ce matin, je reçois un message très étrange en provenance d'une seule base de données. J'ai plusieurs autres bases de données dans le même cluster et je n'ai pas de problème.

Lorsque je cliques sur la base de données dans pgAdmin, je reçois automatiquement le message :
An error has occurred.
FATAL: could not write init file.

Est-ce que vous avez une idée de la source du problème?

Merci beaucoup

#8 Re : Général » Problème très étrange avec une fonction » 29/05/2012 20:13:27

D'accord. Je croyais qu'on pouvait nommer l'expression de retour comme nous pouvions le faire dans MS SQL..

Merci pour votre aide

#9 Général » Problème très étrange avec une fonction » 29/05/2012 19:42:03

charleydc5
Réponses : 9

Bonjour à tous,

J'ai un problème assez étrange avec une fonction et je n'arrive pas à comprendre la cause.

En bref, je j'ai une fonction PL/PGSQL dans laquelle je fais un simple FOR pour construire une chaine de caractères concaténée. À la fin, je veux retourner cette chaine de caractères.

CREATE OR REPLACE FUNCTION mafonction(id integer) RETURNS character varying AS

$BODY$

DECLARE 
	_record RECORD;
	strnoms varchar;

BEGIN
	strnoms := '';

	FOR _record IN 

		... mon select ...
	
	LOOP

		IF (strnoms = '') THEN
			strnoms := strnoms || _record.strnom;
		ELSE
			strnoms := strnoms || ', ' || _record.strnom;
		END IF;
	END LOOP;

	RETURN strnoms;
END

$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

Pour une raison que j'ignore, lorsque j'exécute ma fonction avec un ID connu, elle fonctionne, mais l'entête de colonne est le nom de ma fonction.

Je reçois donc le résultat suivant :

mafonction
character varying
--------------------------------------
nom1, nom2, nom3, nom4, nom5, etc...

Quelqu'un a une idée??

Ce n'est pas un problème avec pgAdmin, car quand je fais un Preview du résultat de ma requête dans mon outil de conception de rapports (JasperSoft iReport), le nom de mon champs est "mafonction".

Très étrange...

Merci pour votre aide et bonne journée!

#10 Re : Général » Supprimer des doublons dans une table (avec jointures) » 16/05/2012 13:02:42

Si je comprends bien, le PARTITION BY est similaire à un GROUP BY?

Merci beaucoup et bonne journée

#11 Général » Supprimer des doublons dans une table (avec jointures) » 15/05/2012 18:23:54

charleydc5
Réponses : 3

Bonjour à tous,

Je fais face à un problème de doublons et j'aimerais avoir vos conseils à propos de cela.

Voici en premier lieu la structure des tables touchées par mon problème :
Table : cas
pk intcasid : integer

Table : intervention
pk intinterventionid : integer
fk intcasid : integer
strnom : character varying

Table : interventiontype
pk intinterventiontypeid : integer
strnom : character varying

Table : cheminement
pk intcheminementid : integer
fk intinterventionid : integer
fk intcheminementtypeid : integer
datcheminement : timestamp
inttemps : integer

Table : cheminementtype
pk intfiletypeid
strnom : character varying

En gros, un cas peut être vu comme un dossier sur lequel un employé travail. Dans le dossier, on y retrouve des interventions de divers types (conseils, encadrement, coaching, etc... Vous comprendrez donc que chaque intervention est reliée à un type). Dans chaque interventions, on des cheminements, autrement dit, des actions portées dans le cadre de l'intervention. Chaque cheminement est également relié à un type (suivi, séance d'information, formation, etc.). C'est au niveau du cheminement que l'employée saisit la date du cheminement ainsi que le temps passé pour l'ensemble du cheminement.

C'est ici que mon doublon se situe. J'aimerais être capable de supprimer les cheminements qui sont pour la même date avec le même temps, pour n'en conserver qu'un seul (peu importe, le MIN ou le MAX intcheminementid).

Voici un exemple de doublon qui rèflète bien ma situation :

intcasid; intervention.strnom; cheminementtype.strnom; datcheminement; inttemps; nombre d'occurences
3194;         "Coaching";          "Séance";          "2011-10-27";          180;          23
3194;         "Coaching";          "Séance";          "2011-10-17";          150;          119
3194;         "Coaching";          "Séance";          "2011-10-25";          180;          55
3194;          "Coaching";          "Séance";          "2011-11-07";          75;           7

La requête qui donne ce résultat :

    SELECT cas.intcasid, intervention.strnom, cheminementtype.strnom, datcheminement, inttemps, COUNT(*)
    FROM cas 

    INNER JOIN intervention ON
    cas.intcasid = intervention.intcasid 

    INNER JOIN interventiontype ON
    intervention.intactivitenomid = interventiontype.intinterventiontypeid

    INNER JOIN cheminement ON
    intervention.intinterventionid = cheminement.intinterventionid
 
    INNER JOIN cheminementtype ON
    cheminement.intcheminementtypeid = cheminementtype.intcheminementtypeid 

    WHERE cas.intcasid = 3194
    
    GROUP BY cas.intcasid, interventiontype.strnom, cheminementtype.strnom, datcheminement, inttemps
    HAVING count(*) > 1;

J'aimerais donc vous lire par rapport à cela, à savoir s'il existe une façon éprouvée dans PostgreSQL pour supprimer le tout proprement. La façon dont je pensais procéder est avec une table temporaire, mais ce n'est pas la plus facile à concevoir et la plus efficace pour un grand ensemble de données.

Je vous remercie à l'avance pour votre aide habituelle.

Bonne journée à tous

Charles

#12 Re : PgAdmin3 » Comment supprimer les colonnes identifiées par pg.dropped dans pgAdmin » 08/03/2012 19:23:48

1.12.2 (Dec 13, 2010, rev: REL-1_2_2)

Il s'agit de la version approuvée chez mon employeur.

Au pire, je vais simplement vivre avec!

Merci beaucoup!

#14 PgAdmin3 » Comment supprimer les colonnes identifiées par pg.dropped dans pgAdmin » 08/03/2012 18:01:48

charleydc5
Réponses : 5

Bonjour à tous,

J'ai remarqué dernièrement que lorsque je veux faire une clé étrangère via pgAdmin, je vois des anciennes colonnes qui ont été changées de table ou simplement supprimées de la base de données. Elle sont identifiées comme ceci : ............pg.dropped.19...........

Je vois cela seulement dans la zone "Referencing".

Comment puis-je supprimer ce genre de "cache" pour ma base de données en entier? Ceci pollue mes listes de colonnes inutilement.

Merci

#15 Re : Optimisation » Comment établir une priorité pour une requête longue à exécuter? » 24/02/2012 14:44:07

En fait, on roule sur Windows 2008 x64 (machine virtuelle dans VMWare). Un seul processeur est attribué à cette machine virtuelle. Je vais donc demander d'allouer plus de processeur (au moins deux) pour nos serveurs PostgreSQL.

En inspectant le serveur pour trouver quelle requête était problématique, j'ai travaillé avec la commande EXPLAIN dans pgAgmin.

Est-ce que vous connaissez un guide qui expliquerait comment traiter les informations qui nous sont fournies par la commande EXPLAIN?

Merci pour votre aide

#16 Optimisation » Comment établir une priorité pour une requête longue à exécuter? » 23/02/2012 20:25:40

charleydc5
Réponses : 4

Bonjour à tous,

J'aimerais savoir s'il existe un moyen de mettre une priorité à basse pour une requête qui prend beaucoup de ressources.

Le problème que j'ai est que lorsqu'un de mes collègues exécute une requête sur notre serveur de développement, le CPU tombe à 100% et l'ensemble de notre équipe est incapable d'utiliser le serveur pendant ce temps.

Comment pourrait-on faire en sorte que la requête n'utilise pas toutes les ressources?

Merci

#17 Re : PL/pgSQL » Création d'une fonction qui retourne plusieurs chaines de caractères » 23/02/2012 20:22:25

Fonctionnel!

Désolé pour le délais à répondre.

Merci pour votre aide, c'est grandement apprécié.

#18 PL/pgSQL » Création d'une fonction qui retourne plusieurs chaines de caractères » 14/02/2012 18:44:08

charleydc5
Réponses : 3

Bonjour à tous,

J'ai codé une fonction afin de retourner une chaine de caractères concaténée, et j'ai toujours un résultat vide alors je voulais vous la montrer à savoir si ce que j'ai fait est correct. La voici :

CREATE OR REPLACE FUNCTION qryListerNoms(intcommerceid integer, intcommercenomactuelid integer)
RETURNS character varying AS

$BODY$

DECLARE 
	_record RECORD;
	strnoms varchar;

BEGIN
	FOR _record IN 
	SELECT * 
	FROM commercenom 
	WHERE 	commercenom.intcommerceid = $1 AND 
		commercenom.intcommercenomid < $2 
	LOOP

		strnoms := strnoms || ', ' || _record.strnom;
	END LOOP;

	RETURN strnoms;

END

$BODY$

LANGUAGE 'plpgsql' VOLATILE
COST 100;

En fait, je veux retourner les anciens noms de commerces, séparés par des virgules, pour un commerce en particulier passé en paramètre (intcommerceid). L'autre paramètre est le ID du nom actuel du commerce (intcommercenomactuelid).

Si je fais un SELECT manuel avec des données réelles, le commerce a bel et bien un historique de nom. Par contre, si j'exécute la fonction dans pgAdmin, j'ai toujours une chaine vide comme résultat.

Avez-vous des idées ou des recommandations?

Merci

#19 Re : Général » Problème d'installation du langage plperl dans PostgreSQL » 28/09/2011 15:25:25

D'accord. Je suis en train d'installer ActivePerl 5.12.4 sur mon serveur de test.

Y a-t-il d'autre moyen avec moins de dépendance pour envoyer un courriel dans PostgreSQL?

Toutes les solutions que j'utilise doivent être approuvées étant donné la grandeur de l'entreprise

Merci!

#20 Général » Problème d'installation du langage plperl dans PostgreSQL » 28/09/2011 13:55:26

charleydc5
Réponses : 4

Bonjour,

J'ai besoin de programmer une fonction dans ma base de données qui sera utilisée pour envoyer des courriels de façon automatisée selon plusieurs critères. Après plusieurs recherches, j'ai découvert qu'il n'y avait pas de moyen "out of the box" pour envoyer des courriels dans PostgreSQL.

Je suis en train de suivre le tutoriel suivant:
http://evilrouters.net/2008/02/01/send- … ostgresql/

La première chose à faire est d'installer le language "plperlu" pour ma base de données. Lorsque je tente d'exécuter la commande "createlang plperlu maBase", j'ai le message suivant:

createlang: language installation failed: ERROR: could not load library "D:/PostgreSQL/9.0/lib/plperl.dll": The specified module could not be found.

Pourtant, lorsque j'explore le dossier D:/PostgreSQL/9.0/lib, je vois le fichier plperl.dll

La commande "select version()" retourne ceci:

PostgreSQL 9.0.3, compiled by Visual C++ build 1500, 64-bit

Quelqu'un a une idée?

Merci pour votre aide habituelle!

#21 Re : Général » Problème de casse dans les requêtes PostgreSQL » 31/08/2011 16:26:04

Merci pour l'info par rapport à citext.

Je suppose qu'il est possible de faire une conversion de varchar à citext sans trop de problème?

#22 Re : Général » Problème de casse dans les requêtes PostgreSQL » 31/08/2011 15:42:33

Utilisateur applicatif.

Nous avons une table dans laquelle tous les utilisateurs sont enregistrés. L'ajout de l'utilisateur se fait via l'application à l'aide des EJB (JSP > Struts ActionForm > Struts Action (DispatchAction) > EJB Session Bean > EJB Entity Bean.

À la toute fin, la méthode suivante est appelée pour sauvegarder le nouvel utilisateur à partir d'un ValueObjet précédemment populé à partir des données saisies dans le formulaires :

    /**
     * Create method
     * 
     * @ejb.create-method view-type = "local"
     */
    public void ejbCreate(UserValue userValue)
        throws javax.ejb.CreateException {
        this.setDatCreation(new Date());
        this.setValue(userValue);
    }

Merci

#23 Général » Problème de casse dans les requêtes PostgreSQL » 31/08/2011 15:08:32

charleydc5
Réponses : 5

Bonjour à tous,

Je migre présentement plusieurs applications de MSSQL et IBM DB2 vers PostgreSQL 9.0.3 et j'éprouve un problème assez important que j'aimerais régler au niveau de la base de données.

Mes applications sont Web et programmées en Java EE avec Entreprise Java Beans (EJB) pour la couche métier. La plupart de interactions entre mes applications et la base de données se font via des requêtes EJB, par exemple:

 * @ejb.finder
 *     	view-type = "local"
 *     	query = "SELECT OBJECT(u) FROM User AS u WHERE (u.intUserId <> ?1) AND (u.strUserLoginName = ?2) AND (u.booArchive = false)"
 *     	signature = "stirq.orrc.ejb.entity.User findByLoginName(java.lang.Integer intUserId, java.lang.String strUserLoginName)"

Dans la requête ci-dessus, on tente d'authentifier l'utilisateur lorsqu'il se connecte à l'application pour voir s'il a accès. Depuis la migration vers PostgreSQL, j'ai certains utilisateurs qui n'avaient plus accès. Après plusieurs recherches, j'ai découvert que ceci avait un lien avec la casse du nom d'utilisateur dans la base de données PostgreSQL.

J'ai donc fait un UPDATE pour mettre tous les noms d'utilisateurs en majuscule. Par contre, j'aimerais bien rendre PostgreSQL insensible à la casse et aux accents car ceci m'éviterait beaucoup de "refactoring".

J'ai vu des solutions de rechange comme ILIKE, mais ceci n'est pas une option puisque je ne code pas les requêtes manuellement dans PostgreSQL via une fonction. Nous utilisons EJBQL qui lui traduit le tout en PostgreSQL via le pilote JDBC (postgresql-9.0-801.jdbc4.jar).

Merci pour votre aide et bonne journée

#24 Re : Général » DELETE FROM avec JOIN » 30/08/2011 14:32:10

Bonjour,

L'instruction suivante a fait le travail :

DELETE FROM stirq.sortiedescription
USING stirq.sortie
WHERE stirq.sortiedescription.intsortieid = stirq.sortie.intsortieid AND
stirq.sortie.intuserid IS NULL;

Est-ce la façon standard de faire?

Merci

#25 Général » DELETE FROM avec JOIN » 30/08/2011 14:10:08

charleydc5
Réponses : 2

Bonjour à tous,

Je n'arrive pas à faire une suppression qui comporte un ou plusieurs "JOIN" à l'intérieur.

Voici mon code:

DELETE FROM stirq.sortiedescription

INNER JOIN stirq.sortie ON
stirq.sortiedescription.intsortieid = stirq.sortie.intsortieid

WHERE stirq.sortie.intuserid IS NULL;

Quelqu'un a une idée?

Merci et bonne journée!

Pied de page des forums

Propulsé par FluxBB