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 05/02/2012, 21h44   #1
Futur Membre du Club
 
Homme domdom
Développeur informatique
Inscription : mars 2011
Messages : 70
Détails du profil
Informations personnelles :
Nom : Homme domdom
Localisation : Angola

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mars 2011
Messages : 70
Points : 19
Points : 19
Par défaut Trigger sous SQL-Server

voila ce schéma

et voila la question:
Écrire un (des) déclencheur(s) qui empêche(nt) d'avoir dans la BD des personnes ayant écrit plus de 2 œuvres et étant traducteur d'un livre
la réponse sur la table ecrit_par :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  CREATE TRIGGER pas2oeuvresTraducteur ON ecrit_par
  after INSERT
  AS
 
     declare @estTraducteur int
     declare @idPersonne int
 
  begin
 
     SET nocount ON;
     SELECT @estTraducteur=0    
     SELECT @idPersonne=ecrivain FROM inserted
 
     SELECT @estTraducteur=count(trad),count(ecrivain) FROM ecrit_par
     JOIN traducteur_ecrivain ON @idPersonne=ecrivain
     JOIN traduit_par ON tradecr=trad
     WHERE @idPersonne=trad
     GROUP BY trad
     HAVING count(ecrivain) > 2    
 
     IF(@estTraducteur > 0)
      ROLLBACK TRANSACTION
  end
j'aimerais bien que vous m'expliquiez brièvement ce que fais ce bout de code
+
ce que je comprends pas:
on a mis after insert faut pas accepter l'enregistrement , on devrait pas déclencher le trigger avant?
cette ligne : et là aussi y'a-t-il une erreur ?? :
Code :
count(trad),count(ecrivain)
et c'est invalider la saisie ,mais transaction je comprends pas
momedalhouma est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2012, 17h02   #2
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 674
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 674
Points : 8 741
Points : 8 741
Bonjour,

Votre trigger est faux de par le simple fait qu'il n'est pas ensembliste.

Citation:
on a mis after insert faut pas accepter l'enregistrement , on devrait pas déclencher le trigger avant?
Cela n'existe pas sous SQL Server : vous avez soit AFTER, soit INSTEAD OF, mais pas BEFORE.

SET NOCOUNT ON est une option de session (c'est-à-dire le contexte d'exécution de votre requête) qui indique à SQL Server de ne pas retourner au client (votre application, SQL Server Management Studio, ...) le nombre de lignes affectées par le trigger.
Donc aucun problème, c'est même une bonne pratique.

Citation:
et c'est invalider la saisie ,mais transaction je comprends pas
Ne confondez pas ce qui se passe côté client (la saisie) et ce qui se passe en base de données (la transaction) : ce sont deux choses bien distinctes et elles doivent le rester.
Une base de donnée relationnelle SQL est conçue pour stocker, modifier et restituer des données, mais pas pour les présenter.

Lorsque l'application va réaliser un INSERT dans cette table, cet INSERT va déclencher le trigger, et le code qu'il exécute fait partie, transactionnellement, de l'INSERT : si l'INSERT plante, le trigger n'est pas exécuté.
Et si le trigger plante, ou que l'on fait un ROLLBACK, l'INSERT est annulé.
Je vous conseille de lire l'article de SQLPro sur le sujet (1).

Voyons donc comment faire avec un trigger INSTEAD OF INSERT : dans ce cas, si la contrainte est vérifiée, on réalise l'INSERT;
sinon, on ne fait rien, et on lève une erreur :

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
32
33
34
35
36
37
38
CREATE TRIGGER TR_IOF_I_ecrit_par
	ON dbo.ecrit_par
INSTEAD OF INSERT
AS
BEGIN
	SET NOCOUNT ON	
 
	IF EXISTS
	(
		SELECT		*
		FROM		dbo.ecrit_par AS EP
		INNER JOIN	inserted AS I
					ON EP.ecrivain = I.ecrivain
		INNER JOIN	dbo.traducteur_ecrivain AS TE
					ON EP.ecrivain = TE.ecrivain
		INNER JOIN	dbo.traduit_par AS TP
					ON TP.ecrivain = TE.ecrivain
		GROUP BY	TE.ecrivain
		HAVING		COUNT(DISTINCT EP.oeuvre) > 2
				AND COUNT(DISTINCT TP.livre) > 0
	)
	BEGIN	
		RAISERROR('Au moins un écrivain a déjà écrit plus de deux livre et traduit plus d''une oeuvre', 16, 1)
 
		RETURN	
	END
	ELSE
	BEGIN
		INSERT	INTO dbo.ecrit_par
		(
			oeuvre
			, ecrivain
		)
		SELECT	oeuvre
			, ecrivain
		FROM	inserted
	END
END
@++
__________________
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 00
Vieux 07/02/2012, 02h22   #3
Futur Membre du Club
 
Homme domdom
Développeur informatique
Inscription : mars 2011
Messages : 70
Détails du profil
Informations personnelles :
Nom : Homme domdom
Localisation : Angola

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mars 2011
Messages : 70
Points : 19
Points : 19
un très grand merci pour toi c'est trop gentil surtout qu'on trouves des problème a comprendre nos profs ; ils sont trop nuls
momedalhouma est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 16h46   #4
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 674
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 674
Points : 8 741
Points : 8 741
Malheureusement les professeurs ont très peu de temps pour nous donner les requis nécessaires à la compréhension de ce qu'est exactement une base de données relationnelle SQL, et bien peu d'entre eux ont l'occasion (ou la passion ?) de coder intensivement en SQL...
Quand on entre dans le monde du travail, la chute est longue ...

Demandez à SQLPro, il en sait quelque chose en tant qu'enseignant au CNAM

@++
__________________
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 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



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


 
 
 
 
Partenaires

Hébergement Web