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 07/06/2007, 17h57   #1
Rédacteur
 
Avatar de aityahia
 
Idir AIT YAHIA
Inscription : mars 2006
Messages : 1 837
Détails du profil
Informations personnelles :
Nom : Idir AIT YAHIA
Âge : 36

Informations forums :
Inscription : mars 2006
Messages : 1 837
Points : 2 183
Points : 2 183
Envoyer un message via MSN à aityahia Envoyer un message via Yahoo à aityahia Envoyer un message via Skype™ à aityahia
Par défaut [FireBird]Edition soumis a une condition

salut a tous

je vous présente mon problèmes.
J'ai une table articles avec un champs TYPE_MOUV qui prend les valeur (PUMP,FIFO et LIFO)
j'aimerai que ce champs soit interdit pour modification si cet article présente des mouvement qui sont référencés dans une autres Table LIGNE_RECEP (c'est a dire en définit le type mouvement dés qu'une réception a été faite il devient non editable).
j'ai pensez a un trigger qui va déclencher une exception.
aityahia est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2007, 09h18   #2
Modérateur
 
Avatar de Cl@udius
 
Homme Claude Renouleaud
Développeur informatique
Inscription : février 2006
Messages : 4 758
Détails du profil
Informations personnelles :
Nom : Homme Claude Renouleaud
Âge : 49
Localisation : France, Hautes Pyrénées (Midi Pyrénées)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : février 2006
Messages : 4 758
Points : 6 779
Points : 6 779
Salut

Oui effectivement tu peux utiliser un trigger pour effectuer ta vérification.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
CREATE TRIGGER article_bu0 FOR article
active before UPDATE position 0
AS
  declare variable v_count integer;
begin
  IF (new.type_mouv <> old.type_mouv) then
  begin
    SELECT count(*)
    FROM ligne_recep
    WHERE article_id = new.article_id
    INTO :v_count;
 
    IF (v_count > 0) then
      exception err_edit_type_mouv;
  end
end
@+ Claudius
__________________
A la question technique que par MP/MV tu formuleras, la réponse aux oubliettes finira.
Cl@udius est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2007, 11h13   #3
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 215
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant spécialité Firebird
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 2 215
Points : 3 318
Points : 3 318
hargh !!!

pas select count, surtout pas !

Exist est de loin plus efficace
__________________
Philippe Makowski
IBPhoenix - Firebird
Membre de l'April
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2007, 11h43   #4
Modérateur
 
Avatar de Cl@udius
 
Homme Claude Renouleaud
Développeur informatique
Inscription : février 2006
Messages : 4 758
Détails du profil
Informations personnelles :
Nom : Homme Claude Renouleaud
Âge : 49
Localisation : France, Hautes Pyrénées (Midi Pyrénées)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : février 2006
Messages : 4 758
Points : 6 779
Points : 6 779
Citation:
Envoyé par makowski
pas select count, surtout pas !
Une ch'tiote explication Philippe !
Il est vrai qu'un exist est peut-être plus efficace, mais pourquoi éviter un select count ?

Merci d'avance pour tes infos.

@+ Claudius
__________________
A la question technique que par MP/MV tu formuleras, la réponse aux oubliettes finira.
Cl@udius est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2007, 12h15   #5
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 215
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant spécialité Firebird
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 2 215
Points : 3 318
Points : 3 318
parce qu'un select count va lire tous les enregistrements correspondants à tes critères
Exists lui va s'arrêter dès le premier enregistrement trouvé

et dans certains cas, cela fait une grosse grosse différence de temps de traitement

bref dans Firebird éviter au maximum le count, sauf quand bien sûr on a vraiment besoin de dénombrer
__________________
Philippe Makowski
IBPhoenix - Firebird
Membre de l'April
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2007, 12h26   #6
Modérateur
 
Avatar de Cl@udius
 
Homme Claude Renouleaud
Développeur informatique
Inscription : février 2006
Messages : 4 758
Détails du profil
Informations personnelles :
Nom : Homme Claude Renouleaud
Âge : 49
Localisation : France, Hautes Pyrénées (Midi Pyrénées)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : février 2006
Messages : 4 758
Points : 6 779
Points : 6 779
Citation:
Envoyé par makowski
Exists lui va s'arrêter dès le premier enregistrement trouvé
Evidemment ca change tout !

Merci
__________________
A la question technique que par MP/MV tu formuleras, la réponse aux oubliettes finira.
Cl@udius est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2007, 12h50   #7
Rédacteur
 
Avatar de aityahia
 
Idir AIT YAHIA
Inscription : mars 2006
Messages : 1 837
Détails du profil
Informations personnelles :
Nom : Idir AIT YAHIA
Âge : 36

Informations forums :
Inscription : mars 2006
Messages : 1 837
Points : 2 183
Points : 2 183
Envoyer un message via MSN à aityahia Envoyer un message via Yahoo à aityahia Envoyer un message via Skype™ à aityahia
alors avec Exist le trigger devindra
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TRIGGER article_bu0 FOR article
active before UPDATE position 0
AS
 
begin
  IF (new.type_mouv <> old.type_mouv) then
  begin
    IF EXIST (SELECT article_id
    FROM ligne_recep
    WHERE article_id = new.article_id) THEN
       exception err_edit_type_mouv;
  end
end
aityahia 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 11h27.


 
 
 
 
Partenaires

Hébergement Web