Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL > Requêtes
Requêtes Forum d'entraide sur les requêtes SQL spécifiques à PostgreSQL, les triggers, les vues, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/10/2011, 10h37   #1
Membre du Club
 
Inscription : juillet 2005
Messages : 245
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 245
Points : 46
Points : 46
Par défaut Tester la casse à la saisie

Bonjour,

Dans une table, j'ai un champ varchar(), je voudrais mettre une contrainte que tous les caractères saisis soient des majuscules. idem dans un autre champ : je voudrais que la première lettre soit une majuscule, et toutes les suivantes soient minuscules.

J'imagine qu'il faut écrire une procédure stockée, ou quelque chose comme ça, mais comment faire ?
Je suis sous postgreSQL.

Merci,
Nico
DiverSIG est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2011, 10h46   #2
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 686
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 686
Points : 10 431
Points : 10 431
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Le contrôle de saisie vous devriez le faire au niveau de votre application.
La base de données va contrôler cette règle via une contrainte CHECK :
Code :
CHECK (colonne = upper(colonne))
Idem pour la première lettre en majuscule :
Code :
CHECK (colonne = initcap(colonne))
Maintenant vous pouvez tout à fait laisser la saisie libre, et forcer la casse dans une vue avec ces mêmes fonctions.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2011, 11h15   #3
Membre du Club
 
Inscription : juillet 2005
Messages : 245
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 245
Points : 46
Points : 46
merci pour les syntaxe SQL.

Code :
Le contrôle de saisie vous devriez le faire au niveau de votre application.
Pourquoi ?

Mon idée, c'est que si un jour j'ai un chargement massif de données à faire, au lieu de passer par l'interface, je fais ça par des scripts sql, et donc, il faut qu'il y ait un contrôle de saisie au niveau de la base...
Mauvais raisonnement ?

Merci,
Nico
DiverSIG est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/10/2011, 12h23   #4
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 958
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 958
Points : 17 789
Points : 17 789
Vous pouvez codez un déclencheur pour ce faire. Exemple :

La table :
Code :
CREATE TABLE T_TEST (C VARCHAR(16));
La fonction :
Code :
1
2
3
4
5
6
7
8
9
10
11
CREATE FUNCTION P_E_I_TEST() 
RETURNS TRIGGER AS  
' 
  BEGIN 
  UPDATE T_TEST
  SET    C = UPPER(C)
  WHERE  C = NEW.C;
  RETURN NULL; 
  END; 
' 
LANGUAGE 'plpgsql';
Le déclencheur incorporant la fonction :
Code :
1
2
3
4
CREATE TRIGGER E_I_TEST
AFTER INSERT 
ON T_TEST 
FOR EACH ROW EXECUTE PROCEDURE P_E_I_TEST ();
Le test :
Code :
INSERT INTO T_TEST VALUES ('toto')
La solution :
Code :
1
2
3
4
5
SELECT * FROM T_TEST
 
C
---------------------------
TOTO
A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2011, 14h09   #5
Modérateur
 
Inscription : octobre 2008
Messages : 1 508
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 508
Points : 2 040
Points : 2 040
Il n'y a pas à faire d'update dans la fonction, il suffit de faire NEW.C = upper(c) et lier la fonction à un trigger BEFORE, ce sera beaucoup plus efficace.
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/10/2011, 14h43   #6
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 686
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 686
Points : 10 431
Points : 10 431
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
SQL-Server ne gère pas les triggers BEFORE.
Mais sur un SGBD qui les supporte vous avez parfaitement raison, le trigger BEFORE sera la plus performant.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2011, 15h54   #7
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 958
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 958
Points : 17 789
Points : 17 789
Citation:
Envoyé par estofilo Voir le message
Il n'y a pas à faire d'update dans la fonction, il suffit de faire NEW.C = upper(c) et lier la fonction à un trigger BEFORE, ce sera beaucoup plus efficace.
J'oublie toujours que PostGreSQL ne sait pas faire des triggers "for each statement" !

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2011, 16h06   #8
Modérateur
 
Inscription : octobre 2008
Messages : 1 508
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 508
Points : 2 040
Points : 2 040
Citation:
Envoyé par SQLpro Voir le message
J'oublie toujours que PostGreSQL ne sait pas faire des triggers "for each statement" !
Tu l'oublies à juste titre, puisque c'est faux:

Code :
1
2
3
4
5
6
7
test=> \h CREATE TRIGGER
Command:     CREATE TRIGGER
Description: define a new TRIGGER
Syntax:
CREATE TRIGGER name { BEFORE | AFTER } { event [ OR ... ] }
    ON TABLE [ FOR [ EACH ] { ROW | STATEMENT } ]
    EXECUTE PROCEDURE funcname ( arguments )
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2011, 16h30   #9
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 958
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 958
Points : 17 789
Points : 17 789
Ah mon dieux, c'est vrai que ça a changé récemment !

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h26.


 
 
 
 
Partenaires

Hébergement Web