IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

TRIGGERS + UPDATE de cote Moyenne d'un livre sur base de 2 tables.


Sujet :

Développement SQL Server

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2020
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2020
    Messages : 8
    Par défaut TRIGGERS + UPDATE de cote Moyenne d'un livre sur base de 2 tables.
    Bonsoir à tous,

    J'espère que vous allez bien?

    Je me retrouve coincé sur un trigger ou je dois effectuer une mise à jour d'une cote globale(de la table livre) d'un livre lors d'une insertion, une mise a jour ou la supression d'une cote d'un emprunteur(dans la table critique).

    Je ne pense pas qu'il me manque grand chose. Mais j'ai beau retourner le probleme dans tous les sens:
    -Lorsque j effectue un test d 'une insertion d'une cote il l insert bien dans la table critique , mais au lieu de me mettre à jour la cote globale de la table Livre , celle ci est remplacée par la nouvelle cote ...

    -> Je pense que cela vient de mon dernier "where"



    CODE:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    --6. L’insertion, la mise à jour ou la suppression d’une critique provoque la mise à jour de la cote moyenne globale du livre. 
    	create TRIGGER maj_cote_livre on critique
    	after insert, update
    	as
    	begin
    		declare @coteCritique numeric
    		declare @newCoteCritique numeric
    		declare @CoteLivre numeric
    		--curseur update
    		declare crsr_moyenne cursor
    		for 
    		select cr.cote, i.cote,l.cote
    		from inserted i
    		join critique cr on i.NumEmprunteur = cr.NumEmprunteur
    		join livre l on l.NumLivre = cr.NumLivre
     
     
    		open crsr_moyenne
    		fetch crsr_moyenne into @coteCritique, @newCoteCritique,@CoteLivre
     
    		while @@fetch_status = 0
    		begin 
    			if((@newCoteCritique > 5) OR (@newCoteCritique < 0) OR @newCoteCritique IS NULL)
    			begin
    				raiserror('la cote ne peut etre inferieur ou superieur à 0 ou 5 / ou nulle',10,1)
    				rollback transaction
    				close crsr_cot
    				deallocate crsr_cot
    				return
    			end
    			--insert
    			if @newCoteCritique IS NOT NULL AND ((@newCoteCritique <= 5) AND (@newCoteCritique > 0) AND @CoteLivre is not null)
    				begin	 
    					update Livre 
    					set cote = (select avg(i.cote)
    								from inserted i
    								join Livre l on l.NumLivre = i.NumLivre 
    								where i.NumLivre = l.NumLivre )
     
    					where cote = @CoteLivre
    					commit transaction 
    					return
    				end
    				fetch crsr_moyenne into @coteCritique,@newCoteCritique,@CoteLivre
    			end
     
    	end
    J'espère que vous pourrez m'aider ,

    merci

  2. #2
    Membre éclairé
    Homme Profil pro
    none
    Inscrit en
    Janvier 2020
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : none

    Informations forums :
    Inscription : Janvier 2020
    Messages : 36
    Par défaut
    Hello,

    Ça va, merci.

    Rapidement, quelques pistes:
    • L'erreur de logique: la mise à jour du livre en le recherchant par sa cote, et non par son identifiant.
    • L'implémentation actuelle: les anciennes valeurs se trouvent dans la pseudo table deleted.
    • Ne pas réfléchir ainsi (procédural) quand on fait du SQL. Cette implémentation est à revoir, il n'y a aucune raison d'utiliser un curseur, rester ensembliste, ce sera plus simple, ça marchera mieux, plus vite. Un update suffit
    • Le besoin. Y a t'il vraiment besoin de stocker cette cote ?


    Have fun

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2020
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2020
    Messages : 8
    Par défaut
    Merci de ta reponse , je ne sais pas si j ai tout compris mais en somme , je devais utiliser mon declencheur sur la table "deleted" ? et le where de mon set sur la "cote" et non le "numLivre" c est bien ca?
    Pour ce qui est du procedural, je suis bien d accord avec toi que niveau perf ca sera surement mieux mais actuellement je suis au niveau de le rendre juste utilisable. Si deja j 'y arrive comme ça je verrai ensuite pour l operateur ensembliste.
    Oui j ai besoin de conserver la cote.
    Cette exercice va me rendre dingue XD

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 009
    Billets dans le blog
    6
    Par défaut
    Si on avait une idée du fonctionnel, on pourrait avancer plus vite vers la solution....

    Décrivez en terme simples et compréhensibles le traitement que vous désirez effectuer en commençant par indiqué ce qu'est une côte... Pour un cycliste ? Un boucher ? Un géographe ?...

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2020
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2020
    Messages : 8
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Si on avait une idée du fonctionnel, on pourrait avancer plus vite vers la solution....

    Décrivez en terme simples et compréhensibles le traitement que vous désirez effectuer en commençant par indiqué ce qu'est une côte... Pour un cycliste ? Un boucher ? Un géographe ?...

    A +
    Le but de l'exercice est de gerer une bibliothèque , mais je pense que si je vous donne le MLD ca sera plus simple.


    Donc ici l'exercice est : L’insertion, la mise à jour ou la suppression d’une critique provoque la mise à jour de
    la cote moyenne globale du livre.

    toutes les cotes de tous les livres se trouvent dans la table critique ( ex : (1,1,3.5,'pas mal'), (2, 1, 4.5, null) <- 2 cotes(3.5, 4.5) de 2 emprunteurs(1 et 2) dif pour un meme livre (1)) et la moyenne de ces cotes pour chaque livre se trouve dans la table Livre à cote (ex : Le livre 1 à donc une note moyenne de 4.0 (cote)).Nom : mld bibli.PNG
Affichages : 163
Taille : 327,3 Ko

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 009
    Billets dans le blog
    6
    Par défaut
    C'est quoi la côte ? Un indice de popularité ?

    Comment cette côte évolue ? Quelle est la règle ?

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  7. #7
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 660
    Billets dans le blog
    10
    Par défaut
    C'est assez curieux d'utiliser le terme de "cote" pour cet usage, car, dans une bilbliothèque (et plus largement dans une médiathèque car c'est vrai aussi pour les DVD, CD et autres supports), la "cote" c'est un code alpha-numérique qui permet de classer les documents.
    Ainsi, pour les romans, la cote s'établit comme suit R + 3 premières lettres de l'auteur, pour les Polars c'est P + 3 premières lettres, les documentaires ont des cotes numériques etc.
    Il va sans dire que ce terme officiel de "cote" est sans rapport avec la présence et la qualité des éventuelles critiques.

  8. #8
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2020
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2020
    Messages : 8
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    C'est quoi la côte ? Un indice de popularité ?

    Comment cette côte évolue ? Quelle est la règle ?

    A +
    Sur critique , c est une evaluation (ou pusieurs) sur 5 donnée par un ou des emprunteurs ayant lu un livre .
    Sur livre, c'est la moyenne de toutes les evaluations pour un livre concerné ( sur 5 elle aussi)

  9. #9
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 009
    Billets dans le blog
    6
    Par défaut
    Dans ton Trigger pour INSERT, UPDATE et DELETE, tu ne devrais avoir que cette requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    UPDATE L
    SET Cote = AVG(C.Cote)
    FROM   Livre AS L
           JOIN Critique AS C
              ON L.NumLivre = C.NumLivre
           JOIN (SELECT NumLivre FROM inserted
                 UNION
                 SELECT NumLivre FROM deleted)
    WHERE  EXSITS(SELECT NULL
                  FROM   Critique AS C2
                  WHERE  C.NumLivre = C2.Numlivre
                  GROUP  BY C2.Numlivre
                  HAVING COUNT(*) >=5)
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  10. #10
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2020
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2020
    Messages : 8
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Dans ton Trigger pour INSERT, UPDATE et DELETE, tu ne devrais avoir que cette requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    WHERE  EXSITS(SELECT NULL
                  FROM   Critique AS C2
                  WHERE  C.NumLivre = C2.Numlivre
                  GROUP  BY C2.Numlivre
                  HAVING COUNT(*) >=5)
    A +
    J'ai une erreur au niveau du where exists me disant "An expression of non-bolean type specified in a context where a condition is expected"...
    je ne comprend pas le select null...

    Edit : okay j ai compris pour le select null , c est comme un select * .

    Citation Envoyé par SQLpro Voir le message
    voici le code avec ton update :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    --6. L’insertion, la mise à jour ou la suppression d’une critique provoque la mise à jour de la cote moyenne globale du livre. 
    	alter TRIGGER maj_cote_livre on critique
    	after insert,delete, update
    	as
    	begin
    		declare @coteCritique numeric
    		declare @newCoteCritique numeric
    		declare @CoteLivre numeric
    		--curseur update
    		declare crsr_moyenne cursor
    		for 
    		select cr.cote, i.cote,l.cote
    		from inserted i
    		join critique cr on i.NumEmprunteur = cr.NumEmprunteur
    		join livre l on l.NumLivre = cr.NumLivre
     
     
    		open crsr_moyenne
    		fetch crsr_moyenne into @coteCritique, @newCoteCritique,@CoteLivre
     
    		while @@fetch_status = 0
    		begin 
    			if((@newCoteCritique > 5) OR (@newCoteCritique < 0) OR @newCoteCritique IS NULL)
    			begin
    				raiserror('la cote ne peut etre inferieur ou superieur à 0 ou 5 / ou nulle',10,1)
    				rollback transaction
    				close crsr_cot
    				deallocate crsr_cot
    				return
    			end
    			--insert
    			if @newCoteCritique IS NOT NULL AND ((@newCoteCritique <= 5) AND (@newCoteCritique > 0) AND @CoteLivre is not null)
    				begin	 
    					UPDATE L
    					SET Cote = AVG(C.Cote)
    					FROM   Livre AS L
    						   JOIN Critique AS C ON L.NumLivre = C.NumLivre
    						   JOIN (SELECT NumLivre FROM inserted
    								 UNION
    								 SELECT NumLivre FROM deleted)
    					WHERE  EXSITS(SELECT *
    									FROM   Critique AS C2
    									WHERE  C.NumLivre = C2.Numlivre
    									GROUP  BY C2.Numlivre
    									HAVING COUNT(*) >=5
    					commit transaction 
    					return
    				end
    				fetch crsr_moyenne into @coteCritique,@newCoteCritique,@CoteLivre
    			end
     
    	end
    ps : je n ai pas encore enlver le curseur

  11. #11
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 009
    Billets dans le blog
    6
    Par défaut
    Mon EXISTS est mal écrit.... EXISTS

    et il manque une jointure ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    UPDATE L
    SET Cote = AVG(C.Cote)
    FROM   Livre AS L
           JOIN Critique AS C
              ON L.NumLivre = C.NumLivre
           JOIN (SELECT NumLivre FROM inserted
                 UNION
                 SELECT NumLivre FROM deleted) AS NL
              ON L.NumLivre = NL.NumLivre
    WHERE  EXISTS(SELECT NULL
                  FROM   Critique AS C2
                  WHERE  C.NumLivre = C2.Numlivre
                  GROUP  BY C2.Numlivre
                  HAVING COUNT(*) >=5)
    Si vous respectiez es consignes de postage en postant le DDL de vos tables on avancerait plus vite !
    A lire : https://www.developpez.net/forums/d9...vement-poster/

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  12. #12
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2020
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2020
    Messages : 8
    Par défaut
    Désolé c'est nouveau pour moi , j'ai lu la chartes sans entrer dans les détails .
    Comme ceci ? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
     
    USE [in19b1177]
    GO
    /****** Object:  Table [dbo].[Auteur]    Script Date: 03-04-20 16:43:47 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    SET ANSI_PADDING ON
    GO
    CREATE TABLE [dbo].[Auteur](
    	[NumAuteur] [int] NOT NULL,
    	[Nom] [varchar](30) NOT NULL,
    	[DateNaissance] [smalldatetime] NULL,
    PRIMARY KEY CLUSTERED 
    (
    	[NumAuteur] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
     
    GO
    SET ANSI_PADDING OFF
    GO
    /****** Object:  Table [dbo].[Categorie]    Script Date: 03-04-20 16:43:48 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    SET ANSI_PADDING ON
    GO
    CREATE TABLE [dbo].[Categorie](
    	[NumCategorie] [int] NOT NULL,
    	[Nom] [varchar](30) NOT NULL,
    	[CategorieParent] [int] NULL,
    PRIMARY KEY CLUSTERED 
    (
    	[NumCategorie] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
     
    GO
    SET ANSI_PADDING OFF
    GO
    /****** Object:  Table [dbo].[CatEmprunteur]    Script Date: 03-04-20 16:43:48 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    SET ANSI_PADDING ON
    GO
    CREATE TABLE [dbo].[CatEmprunteur](
    	[NumCategorie] [int] NOT NULL,
    	[Designation] [varchar](30) NOT NULL,
    	[Cotisation] [numeric](6, 2) NOT NULL,
    PRIMARY KEY CLUSTERED 
    (
    	[NumCategorie] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
     
    GO
    SET ANSI_PADDING OFF
    GO
    /****** Object:  Table [dbo].[Critique]    Script Date: 03-04-20 16:43:48 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    SET ANSI_PADDING ON
    GO
    CREATE TABLE [dbo].[Critique](
    	[NumEmprunteur] [int] NOT NULL,
    	[NumLivre] [int] NOT NULL,
    	[Cote] [numeric](2, 1) NOT NULL,
    	[Commentaire] [varchar](100) NULL,
     CONSTRAINT [ID_Critique_ID] PRIMARY KEY CLUSTERED 
    (
    	[NumLivre] ASC,
    	[NumEmprunteur] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
     
    GO
    SET ANSI_PADDING OFF
    GO
    /****** Object:  Table [dbo].[Editeur]    Script Date: 03-04-20 16:43:48 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    SET ANSI_PADDING ON
    GO
    CREATE TABLE [dbo].[Editeur](
    	[NumEditeur] [int] NOT NULL,
    	[Nom] [varchar](30) NOT NULL,
    	[Adresse] [varchar](50) NOT NULL,
    	[Localite] [varchar](30) NOT NULL,
     CONSTRAINT [ID_Editeur_ID] PRIMARY KEY CLUSTERED 
    (
    	[NumEditeur] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
     
    GO
    SET ANSI_PADDING OFF
    GO
    /****** Object:  Table [dbo].[Emplacement]    Script Date: 03-04-20 16:43:48 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    SET ANSI_PADDING ON
    GO
    CREATE TABLE [dbo].[Emplacement](
    	[NumEtagere] [int] NOT NULL,
    	[Allee] [char](1) NOT NULL,
    	[Etage] [int] NOT NULL,
    PRIMARY KEY CLUSTERED 
    (
    	[NumEtagere] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
     
    GO
    SET ANSI_PADDING OFF
    GO
    /****** Object:  Table [dbo].[Emprunteur]    Script Date: 03-04-20 16:43:48 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    SET ANSI_PADDING ON
    GO
    CREATE TABLE [dbo].[Emprunteur](
    	[NumEmprunteur] [int] NOT NULL,
    	[Nom] [varchar](30) NOT NULL,
    	[Prenom] [varchar](30) NOT NULL,
    	[Adresse] [varchar](50) NOT NULL,
    	[Localite] [varchar](30) NOT NULL,
    	[Cotisation] [numeric](6, 2) NULL,
    	[RegNat] [varchar](20) NOT NULL,
    	[CatEmprunteur] [int] NOT NULL,
    	[DatePaiementCotisation] [smalldatetime] NULL,
    PRIMARY KEY CLUSTERED 
    (
    	[NumEmprunteur] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
    UNIQUE NONCLUSTERED 
    (
    	[RegNat] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
     
    GO
    SET ANSI_PADDING OFF
    GO
    /****** Object:  Table [dbo].[Exemplaire]    Script Date: 03-04-20 16:43:48 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[Exemplaire](
    	[NumLivre] [int] NOT NULL,
    	[NumExemplaire] [int] NOT NULL,
    	[Etat] [int] NOT NULL,
    	[DateAchat] [smalldatetime] NOT NULL,
    	[NumEtagere] [int] NOT NULL,
     CONSTRAINT [ID_Exemplaire_ID] PRIMARY KEY CLUSTERED 
    (
    	[NumLivre] ASC,
    	[NumExemplaire] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
     
    GO
    /****** Object:  Table [dbo].[Langue]    Script Date: 03-04-20 16:43:48 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    SET ANSI_PADDING ON
    GO
    CREATE TABLE [dbo].[Langue](
    	[CodeIso] [char](3) NOT NULL,
    	[NomLangue] [varchar](70) NOT NULL,
    PRIMARY KEY CLUSTERED 
    (
    	[CodeIso] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
     
    GO
    SET ANSI_PADDING OFF
    GO
    /****** Object:  Table [dbo].[Livre]    Script Date: 03-04-20 16:43:48 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    SET ANSI_PADDING ON
    GO
    CREATE TABLE [dbo].[Livre](
    	[NumLivre] [int] NOT NULL,
    	[Titre] [varchar](70) NOT NULL,
    	[ISBN] [varchar](30) NOT NULL,
    	[NbPages] [int] NOT NULL,
    	[Cote] [numeric](2, 1) NOT NULL,
    	[DatePublication] [smalldatetime] NOT NULL,
    	[NumEditeur] [int] NOT NULL,
    	[NumCategorie] [int] NOT NULL,
    	[Langue] [char](3) NOT NULL,
    	[NumType] [int] NOT NULL,
     CONSTRAINT [ID_Livre_ID] PRIMARY KEY CLUSTERED 
    (
    	[NumLivre] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
    UNIQUE NONCLUSTERED 
    (
    	[ISBN] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
     
    GO
    SET ANSI_PADDING OFF
    GO
    /****** Object:  Table [dbo].[Location]    Script Date: 03-04-20 16:43:48 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[Location](
    	[NumEmprunteur] [int] NOT NULL,
    	[NumLivre] [int] NOT NULL,
    	[NumExemplaire] [int] NOT NULL,
    	[DateLocation] [smalldatetime] NOT NULL,
    	[DateRetourPrevu] [smalldatetime] NOT NULL,
    	[DateRetour] [smalldatetime] NULL,
    PRIMARY KEY CLUSTERED 
    (
    	[NumEmprunteur] ASC,
    	[NumLivre] ASC,
    	[NumExemplaire] ASC,
    	[DateLocation] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
     
    GO
    /****** Object:  Table [dbo].[Redaction]    Script Date: 03-04-20 16:43:48 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[Redaction](
    	[NumAuteur] [int] NOT NULL,
    	[NumLivre] [int] NOT NULL,
     CONSTRAINT [ID_Redaction_ID] PRIMARY KEY CLUSTERED 
    (
    	[NumLivre] ASC,
    	[NumAuteur] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
     
    GO
    /****** Object:  Table [dbo].[Type]    Script Date: 03-04-20 16:43:48 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    SET ANSI_PADDING ON
    GO
    CREATE TABLE [dbo].[Type](
    	[NumType] [int] NOT NULL,
    	[Description] [varchar](100) NOT NULL,
    PRIMARY KEY CLUSTERED 
    (
    	[NumType] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
     
    GO
    SET ANSI_PADDING OFF
    GO
    ALTER TABLE [dbo].[Livre] ADD  DEFAULT ((0)) FOR [NbPages]
    GO
    ALTER TABLE [dbo].[Categorie]  WITH CHECK ADD FOREIGN KEY([CategorieParent])
    REFERENCES [dbo].[Categorie] ([NumCategorie])
    GO
    ALTER TABLE [dbo].[Critique]  WITH CHECK ADD FOREIGN KEY([NumEmprunteur])
    REFERENCES [dbo].[Emprunteur] ([NumEmprunteur])
    GO
    ALTER TABLE [dbo].[Critique]  WITH CHECK ADD FOREIGN KEY([NumLivre])
    REFERENCES [dbo].[Livre] ([NumLivre])
    GO
    ALTER TABLE [dbo].[Emprunteur]  WITH CHECK ADD FOREIGN KEY([CatEmprunteur])
    REFERENCES [dbo].[CatEmprunteur] ([NumCategorie])
    GO
    ALTER TABLE [dbo].[Exemplaire]  WITH CHECK ADD FOREIGN KEY([NumEtagere])
    REFERENCES [dbo].[Emplacement] ([NumEtagere])
    GO
    ALTER TABLE [dbo].[Exemplaire]  WITH CHECK ADD FOREIGN KEY([NumLivre])
    REFERENCES [dbo].[Livre] ([NumLivre])
    GO
    ALTER TABLE [dbo].[Livre]  WITH CHECK ADD FOREIGN KEY([Langue])
    REFERENCES [dbo].[Langue] ([CodeIso])
    GO
    ALTER TABLE [dbo].[Livre]  WITH CHECK ADD FOREIGN KEY([NumCategorie])
    REFERENCES [dbo].[Categorie] ([NumCategorie])
    GO
    ALTER TABLE [dbo].[Livre]  WITH CHECK ADD FOREIGN KEY([NumEditeur])
    REFERENCES [dbo].[Editeur] ([NumEditeur])
    GO
    ALTER TABLE [dbo].[Livre]  WITH CHECK ADD FOREIGN KEY([NumType])
    REFERENCES [dbo].[Type] ([NumType])
    GO
    ALTER TABLE [dbo].[Location]  WITH CHECK ADD FOREIGN KEY([NumLivre], [NumExemplaire])
    REFERENCES [dbo].[Exemplaire] ([NumLivre], [NumExemplaire])
    GO
    ALTER TABLE [dbo].[Location]  WITH CHECK ADD FOREIGN KEY([NumEmprunteur])
    REFERENCES [dbo].[Emprunteur] ([NumEmprunteur])
    GO
    ALTER TABLE [dbo].[Redaction]  WITH CHECK ADD FOREIGN KEY([NumAuteur])
    REFERENCES [dbo].[Auteur] ([NumAuteur])
    GO
    ALTER TABLE [dbo].[Redaction]  WITH CHECK ADD FOREIGN KEY([NumLivre])
    REFERENCES [dbo].[Livre] ([NumLivre])
    GO
    ALTER TABLE [dbo].[Exemplaire]  WITH CHECK ADD CHECK  (([Etat]<=(10)))
    GO
    ALTER TABLE [dbo].[Livre]  WITH CHECK ADD CHECK  (([cote]<=(5.0)))
    GO

  13. #13
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 009
    Billets dans le blog
    6
    Par défaut
    Oui....

    As tu testé la nouvelle version du déclencheur ?

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. Livre sur base de données distribuée sous Oracle
    Par mesnsen dans le forum Livres
    Réponses: 1
    Dernier message: 22/11/2016, 21h47
  2. Trigger Update (MSDE 2000 + ACCESS)
    Par Pierre Fauconnier dans le forum Développement
    Réponses: 1
    Dernier message: 26/10/2006, 09h32
  3. [trigger] update inserted?
    Par cosminutza dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 01/06/2005, 10h37
  4. Réponses: 2
    Dernier message: 10/05/2005, 19h15
  5. Trigger Update et Column_Updated
    Par Pm dans le forum Développement
    Réponses: 2
    Dernier message: 16/06/2004, 10h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo