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
|
ALTER PROCEDURE [dbo].[spCreateUpdateEnfantPersonnel]
/*-----------------------------------------------------------*/
/* Création/mise à jour d'un enfant d'un personnel (crypté). */
/*-----------------------------------------------------------*/
@IdEnfant UNIQUEIDENTIFIER,
@IdPersonnel UNIQUEIDENTIFIER,
@IdActiviteEnfant UNIQUEIDENTIFIER,
@Nom NVARCHAR(60),
@Prenom NVARCHAR(60),
@DateAnneeNaissance DATETIME,
@DateNaissanceComplete BIT,
@Sexe BIT,
@AppartientFoyer BIT,
@Commentaire NVARCHAR(MAX),
@ErrorNumber INTEGER OUTPUT,
@ErrorDescription NVARCHAR(2060) OUTPUT
AS
SET NOCOUNT ON
-- NVARCHAR(MAX) a NULL si pas de commentaire.
IF LEN(RTRIM(LTRIM(@Commentaire))) = 0
SET @Commentaire = NULL
-- GUID de la clé symétrique.
DECLARE @KeyGUID UNIQUEIDENTIFIER
SET @KeyGUID = Key_GUID('BureauMobileSymmetricKey')
-- Début de la capture d'erreur.
BEGIN TRY
-- Transaction :
-- 1) En cas d'erreur, annule toute la transaction (SET XACT_ABORT ON).
-- 2) Niveau d'isolation SERIALIZABLE pour éviter l'apparition d'un item entre
-- a) la vérification de présence de fiche enfant,
-- b) la mise à jour de la fiche enfant.
SET XACT_ABORT ON
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION
-- Fiches enfants du personnel.
SELECT
IdEnfant,
IdActiviteEnfant,
Nom,
Prenom,
DateAnneeNaissance,
DateNaissanceComplete,
Sexe,
AppartientFoyer,
Commentaire
INTO #tmpEnfant
FROM tbEnfant
WHERE IdPersonnel = @IdPersonnel
-- Vérifie l'existence d'une fiche identique.
DECLARE @FicheIdentiqueExiste INTEGER
SET @FicheIdentiqueExiste = (
SELECT COUNT(*)
FROM #tmpEnfant
WHERE
IdEnfant = @IdEnfant AND
IdActiviteEnfant = @IdActiviteEnfant AND
DecryptByKey(Nom) = @Nom AND
DecryptByKey(Prenom) = @Prenom AND
CONVERT(DATETIME,CONVERT(NVARCHAR(10),DecryptByKey(DateAnneeNaissance))) = @DateAnneeNaissance AND
DateNaissanceComplete = @DateNaissanceComplete AND
Sexe = @Sexe AND
AppartientFoyer = @AppartientFoyer AND
ISNULL(dbo.fnDecrypteNVarCharMax(Commentaire),'') = ISNULL(@Commentaire,''))
IF @FicheIdentiqueExiste = 0
BEGIN
-- Pas de fiche identique. Une fiche existe-t-elle avec des données différentes ?
DECLARE @FicheExiste INTEGER
SET @FicheExiste = (
SELECT COUNT(*)
FROM #tmpEnfant
WHERE IdEnfant = @IdEnfant )
IF @FicheExiste = 1
BEGIN
-- Oui, dans ce cas on met à jour les données de cette fiche.
UPDATE tbEnfant
SET
IdActiviteEnfant = @IdActiviteEnfant,
Nom = EncryptByKey(@KeyGUID,@Nom),
Prenom = EncryptByKey(@KeyGUID,@Prenom),
DateAnneeNaissance = EncryptByKey(@KeyGUID,dbo.fnDateToDmyString(@DateAnneeNaissance)),
DateNaissanceComplete = @DateNaissanceComplete,
Sexe = @Sexe,
AppartientFoyer = @AppartientFoyer,
Commentaire = dbo.fnCrypteNVarCharMax(@Commentaire)
WHERE IdEnfant = @IdEnfant
END
ELSE
BEGIN
-- Non, dans ce cas, on créé la fiche.
INSERT INTO tbEnfant (
IdEnfant,
IdPersonnel,
IdActiviteEnfant,
Nom,
Prenom,
DateAnneeNaissance,
DateNaissanceComplete,
Sexe,
AppartientFoyer,
Commentaire)
VALUES (
@IdEnfant,
@IdPersonnel,
@IdActiviteEnfant,
EncryptByKey(@KeyGUID,@Nom),
EncryptByKey(@KeyGUID,@Prenom),
EncryptByKey(@KeyGUID,dbo.fnDateToDmyString(@DateAnneeNaissance)),
@DateNaissanceComplete,
@Sexe,
@AppartientFoyer,
dbo.fnCrypteNVarCharMax(@Commentaire) )
END
END
-- Supprime la table temporaire.
DROP TABLE #tmpEnfant
-- Fin de la transaction.
COMMIT TRANSACTION
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
SET XACT_ABORT OFF
SET @ErrorNumber = NULL
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
SET XACT_ABORT OFF
SET @ErrorNumber = ERROR_NUMBER()
SET @ErrorDescription = ERROR_MESSAGE()
END CATCH |
Partager