Hello,
Je suis confronté à un problème avec une SP qui doit être une grosse connerie mais je ne la vois et j'en perds mon latin !
Voici le code de la procédure :
Rien de bien folichon quoi... Histoire d'essayer d'y voir clair, je la teste en faisant 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 CREATE PROCEDURE [S_OPERATIONAL].[UP_CHIEF_SAVE] @PEM_ID INT, @CHI_FROM DATE, @CHI_TO DATE AS BEGIN SET NOCOUNT ON; IF EXISTS(SELECT 1 FROM S_OPERATIONAL.V_CHIEF_CHI WHERE PEM_ID = @PEM_ID AND CHI_FROM = @CHI_FROM) BEGIN UPDATE S_OPERATIONAL.V_CHIEF_CHI SET CHI_FROM = @CHI_FROM, CHI_TO = @CHI_TO WHERE PEM_ID = @PEM_ID END ELSE BEGIN INSERT INTO S_OPERATIONAL.V_CHIEF_CHI (PEM_ID, CHI_FROM, CHI_TO) VALUES(@PEM_ID, @CHI_FROM, @CHI_TO) END END
J'ai donc extrait le code (sauf SET NOCOUNT ON;), déclaré des variables pour remplacé les paramètres et ajouté un select histoire de voir dans quelle branche du IF sql server passe.
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 DECLARE @PEM_ID INT = 773 DECLARE @CHI_FROM DATE = '20140516' DECLARE @CHI_TO DATE = '20141231' IF EXISTS(SELECT 1 FROM S_OPERATIONAL.V_CHIEF_CHI WHERE PEM_ID = @PEM_ID AND CHI_FROM = @CHI_FROM) BEGIN UPDATE S_OPERATIONAL.V_CHIEF_CHI SET CHI_FROM = @CHI_FROM, CHI_TO = @CHI_TO WHERE PEM_ID = @PEM_ID SELECT 'UPDATE' END ELSE BEGIN INSERT INTO S_OPERATIONAL.V_CHIEF_CHI (PEM_ID, CHI_FROM, CHI_TO) VALUES(@PEM_ID, @CHI_FROM, @CHI_TO) SELECT 'INSERT' END
Je l'exécute et, dans l'onglet Results de SSMS, j'ai bien UPDATE mais dans l'onglet message, j'ai ceci :
Pourquoi diable tente-t-il d'insérer une ligne alors qu'il est sensé faire un update ? Il n'y a pas de trigger sur la vue. Il y a un trigger sur la table sous-jacente mais qui n'entre pas en ligne de compte ici (vu qu'il ne fait aucune insertion ^^). Par souci de transparence, voici le code du trigger :Msg 2627, Level 14, State 1, Line 7
Violation of PRIMARY KEY constraint 'PK__T_CHIEF___16EBFA2672E607DB'. Cannot insert duplicate key in object 'S_OPERATIONAL.T_CHIEF_CHI'. The duplicate key value is (773, 2014-05-16).
The statement has been terminated.
(1 row(s) affected)
Bref, j'ai beau retourné le problème dans tous les sens, je ne parviens pas à comprendre pourquoi SQL SERVER tente d'insérer une ligne dans la table T_CHIEF_CHI alors qu'il doit clairement faire un update...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 CREATE TRIGGER [S_OPERATIONAL].[TRG_AFTER_UPDATE_CHI] ON [S_OPERATIONAL].[T_CHIEF_CHI] AFTER UPDATE AS BEGIN SET NOCOUNT ON; UPDATE S_OPERATIONAL.T_CHIEF_CHI SET CHI_MODIFIED_ON = GETDATE(), CHI_MODIFIED_BY = SYSTEM_USER FROM S_OPERATIONAL.T_CHIEF_CHI CHI INNER JOIN INSERTED INS ON CHI.PEM_ID = INS.PEM_ID END;
Quelqu'un aurait-il une idée ??
Merci d'avance !
Partager