Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
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 23/10/2011, 20h36   #1
Nouveau Membre du Club
 
Homme demba sock
etudiant
Inscription : mai 2010
Messages : 97
Détails du profil
Informations personnelles :
Nom : Homme demba sock
Localisation : Sénégal

Informations professionnelles :
Activité : etudiant

Informations forums :
Inscription : mai 2010
Messages : 97
Points : 27
Points : 27
Par défaut procedure dans un trigger

bonsoir ,
j'ai plusieurs tables mais je dois dans une table faire une contrainte sur une table "contrat" car je dois limiter a un locataire un nombre de logement a 3 , vu que chaque logement a un seul contrat et chaque contrat un locataire j'ai joué sur la clé etrangére du locataire qui se trouve sur la table contrat pour faire la contrainte mais je ne sais pas pourquoi cela ne marche pas voici mes 2 codes :
procedure
Code :
1
2
3
4
5
6
7
CREATE procedure nbre_logement (@num_locataire int)
AS 
 IF( SELECT COUNT(num_locataire) FROM contrat WHERE num_contrat=@num_locataire) > 3  
 begin
 print 'vous ne pouvez pas depasser 3 logements'
 RETURN
 end
et trigger
Code :
1
2
3
4
5
6
7
8
9
10
CREATE TRIGGER controle_nbr_log ON contrat
FOR INSERT AS
begin
declare @loc AS int;
declare @nbr AS int;
 
SET @loc =(SELECT num_locataire FROM inserted )
 SET @nbr= nbre_logement(@loc )
 
end
et l'erreur aussi
Code :
1
2
Msg*195, Niveau*15, État*10, Procédure*controle_nbr_log, Ligne*9
'nbre_logement' n'est pas une option nom de fonction intégrée reconnue.
MERCI , je suis debutant
doumbix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/10/2011, 07h47   #2
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Ne créez pas une PROCEDURE mais une fonction scalaire vous retounant un bit à 1 si c'est bon par exemple...


Avec celle-ci pas besoin d'un TRIGGER au passage... vous pouvez ajoutez une contrainte CHECK directement sur la table :
Code :
CHECK (dbo.FN_CHECK_NBRE_LOGEMENT(num_locataire)=1)
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/10/2011, 11h14   #3
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 959
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 959
Points : 17 791
Points : 17 791
Plus simple :

Code :
1
2
3
4
5
6
7
8
CREATE FUNCTION F_NBR_LOGEMENT (@num_locataire int)
RETURNS INT
AS 
BEGIN
   RETURN (SELECT *
          FROM   dbo.contrat 
           WHERE  num_contrat=@num_locataire);
END
Code :
1
2
3
ALTER TABLE dbo.contrat 
   ADD CONSTRAINT CK_LIMITE_CONTRAT
   CHECK (dbo.F_NBR_LOGEMENT(num_contrat) <= 3);
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 25/10/2011, 17h41   #4
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 670
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 670
Points : 8 732
Points : 8 732
Bonjour,

Dans le code de SQLPro, remplacez * par COUNT(*)

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h43.


 
 
 
 
Partenaires

Hébergement Web