Précédent   Forum des professionnels en informatique > Bases de données > Firebird > SQL
SQL Forum d'entraide sur le SQL pour Firebird
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 18/08/2011, 10h36   #1
Membre Expert
 
Homme AbdelHakim Kellouche
Inscription : mai 2008
Messages : 1 977
Détails du profil
Informations personnelles :
Nom : Homme AbdelHakim Kellouche
Localisation : Algérie

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : mai 2008
Messages : 1 977
Points : 2 126
Points : 2 126
Envoyer un message via MSN à Just-Soft Envoyer un message via Skype™ à Just-Soft
Par défaut FB 2.5, comment empêcher les doublons par déclencheur ?

Salut

sur une table qui n'a pas de clé primaire, je voudrais empêcher l'ajout de lignes en double alors j'ai pensé à contrôler ça dans le before insert et update de cette table. mon idée étant de parcourir la table en faisant une recherche sur 4 champs, si le nombre de lignes retournés et supérieur à 0 une exception est déclenchée.

voici le déclencheur responsable de cette manip :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
CREATE OR ALTER TRIGGER tb_frais_exploitations_bi0 FOR tb_frais_exploitations
active before INSERT position 0
AS
    declare variable date_m date;
    declare variable c_centre smallint;
    declare variable c_secteur smallint;
    declare variable c_sr smallint;
    declare variable c_step smallint;
 
begin
  /* sélectionner les champs qui ne peuvent être en double une fois réunis */
  SELECT date_mois, code_centre, code_secteur, code_sr, code_step
 
  FROM tb_frais_exploitations a
 
  WHERE (      a.date_mois = new.date_mois
        AND a.code_centre = new.code_centre
        AND a.code_step = new.code_step
        AND a.code_sr = new.code_sr
        AND a.code_secteur = new.code_secteur )
 
  INTO  :date_m,
        :c_centre,
        :c_secteur,
        :c_sr,
        :c_step;
 
  /* rechercher la ligne correspondante, si trouver alors générer l'exception */
  IF ( row_count > 0) then exception Ligne_En_double;
 
end
malheureusement je n'intercepte rien ! peut-être que row-count a des restrictions dont je connais pas ?

une idée, une piste .... merci par avance.
__________________
Bon courage ou Bonne Chance (selon le contexte)
Just-Soft est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2011, 12h44   #2
Modérateur
 
Avatar de SergioMaster
 
Serge Girard
Développeur informatique
Inscription : janvier 2007
Messages : 3 616
Détails du profil
Informations personnelles :
Nom : Serge Girard
Âge : 55
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : janvier 2007
Messages : 3 616
Points : 4 521
Points : 4 521
Plutôt qu'un rowCount , un simple Count dans ta requête devrait suffire

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
CREATE OR ALTER TRIGGER tb_frais_exploitations_bi0 FOR tb_frais_exploitations
active before INSERT position 0
AS
    declare c Integer;
begin
  /* sélectionner les champs qui ne peuvent être en double une fois réunis */
  SELECT Count(*) AS C
 
  FROM tb_frais_exploitations a
 
  WHERE (      a.date_mois = new.date_mois
        AND a.code_centre = new.code_centre
        AND a.code_step = new.code_step
        AND a.code_sr = new.code_sr
        AND a.code_secteur = new.code_secteur )
 
  INTO  :C
  /* rechercher la ligne correspondante, si trouver alors générer l'exception */
  IF ( C > 0) then exception Ligne_En_double;
 
end
Ceci dit , pourquoi ne pas mettre un Index Unique ?
__________________
La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein
J'entends et j'oublie. Je vois et je me souviens. Je fais et je comprends . Confucius
SergioMaster est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2011, 16h52   #3
Membre Expert
 
Homme AbdelHakim Kellouche
Inscription : mai 2008
Messages : 1 977
Détails du profil
Informations personnelles :
Nom : Homme AbdelHakim Kellouche
Localisation : Algérie

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : mai 2008
Messages : 1 977
Points : 2 126
Points : 2 126
Envoyer un message via MSN à Just-Soft Envoyer un message via Skype™ à Just-Soft
Citation:
Envoyé par SergioMaster Voir le message
[/code]Ceci dit , pourquoi ne pas mettre un Index Unique ?
et dire qu'hier j'ai passé la journée toute entière à essayer la clé unique mais j'avais une erreur incompréhensible

merci serge, ça marche très bien avec cette fameuse clé unique
__________________
Bon courage ou Bonne Chance (selon le contexte)
Just-Soft est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h07.


 
 
 
 
Partenaires

Hébergement Web