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
| CREATE TABLE Utilisateur
(
Id_Utilisateur int NOT NULL IDENTITY(-2147483648, 1)
CONSTRAINT PK_Utilisateur PRIMARY KEY
, Nom_Utilisateur varchar(16) NOT NULL
-- CONSTRAINT UQ_Utilisateur UNIQUE
, mdp varchar(32) NOT NULL
-- CONSTRAINT CHK_Utilisateur__mdp CHECK(LEN(mdp) >= 7)
, email varchar(256) NOT NULL
-- CONSTRAINT CHK_Utilisateur__email CHECK (email LIKE '%@%.%')
, telephone char(10) NOT NULL -- Numérotation Française seulement ?
-- CONSTRAINT CHK_Utilisateur_telephone CHECK (telephone LIKE '0[5-6]%')
)
GO
-- Création d'une table de journalisation des erreurs
SELECT TOP 0 *
INTO dbo.Utilisateur_error_log
FROM dbo.Utilisateur
GO
-- Ajout d'une colonne d'hotodatage
ALTER TABLE dbo.Utilisateur_error_log
ADD log_time datetime NOT NULL
CONSTRAINT DF_Utilisateur_error_log__log_time DEFAULT (GETDATE())
GO
-- Ajout d'une colonne de type de modification
ALTER TABLE dbo.Utilisateur_error_log
ADD type_modification char(1) NOT NULL
CONSTRAINT CHK_Utilisateur_error_log__type_modification CHECK(type_modification IN ('I', 'U'))
GO
-- Et voilà le trigger
CREATE TRIGGER TR_IOF_IU_Utilisateur
ON dbo.Utilisateur
AFTER INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON
DECLARE @is_update bit = 0
-- S'il existe des lignes dans la table virtuelle DELETED,
-- nous sommes dans le cas d'un UPDATE.
IF EXISTS
(
SELECT *
FROM deleted
)
BEGIN
SET @is_update = 1
END
-- Cas de l'INSERT
IF @is_update = 0
BEGIN
-- On ajoute à la table seulement les
-- utilisateurs dont les données sont valides
INSERT INTO dbo.Utilisateur
(
Nom_Utilisateur
, mdp
, email
, telephone
)
SELECT Nom_Utilisateur
, mdp
, email
, telephone
FROM INSERTED AS I
WHERE NOT EXISTS
(
SELECT *
FROM dbo.Utilisateur AS U
WHERE I.Nom_Utilisateur = U.Nom_Utilisateur
)
AND LEN(I.mdp) >= 7 -- La longueur du mot de passe est d'au moins 7 caractères
AND I.email LIKE '%@%.%' -- l'email contient un arobase, mais aussi un point après cet arobase
AND I.telephone LIKE '0[5-6]%' -- le numéro de téléphone commence par 05 ou 06
-- On enregistre dans la table des rejets
-- les données collectées pour les utilisateurs dont celles-ci sont incorrectes
INSERT INTO dbo.Utilisateur_error_log
(
Nom_Utilisateur
, mdp
, email
, telephone
, type_modification
)
SELECT Nom_Utilisateur
, mdp
, email
, telephone
, 'I'
FROM INSERTED AS I
WHERE EXISTS
(
SELECT *
FROM dbo.Utilisateur AS U
WHERE I.Nom_Utilisateur = U.Nom_Utilisateur
)
OR LEN(I.mdp) < 7 -- La longueur du mot de passe est d'au moins 7 caractères
OR I.email NOT LIKE '%@%.%' -- l'email contient un arobase, mais aussi un point après cet arobase
OR I.telephone NOT LIKE '0[5-6]%' -- le numéro de téléphone commence par 05 ou 06
IF @@ROWCOUNT > 0
BEGIN
RAISERROR('Certains utilisateurs n''ont pas été enregistrés car les données sont incorrectes', 10, 1)
END
END
ELSE
BEGIN
UPDATE dbo.Utilisateur
SET Nom_Utilisateur = I.Nom_Utilisateur
, mdp = I.mdp
, email = I.email
, telephone = I.telephone
FROM dbo.Utilisateur AS U
INNER JOIN INSERTED AS I
ON I.Id_Utilisateur = U.Id_Utilisateur
WHERE LEN(I.mdp) >= 7 -- La longueur du mot de passe est d'au moins 7 caractères
AND I.email LIKE '%@%.%' -- l'email contient un arobase, mais aussi un point après cet arobase
AND I.telephone LIKE '0[5-6]%' -- le numéro de téléphone commence par 05 ou 06
-- On enregistre dans la table des rejets
-- les données collectées pour les utilisateurs dont celles-ci sont incorrectes
INSERT INTO dbo.Utilisateur_error_log
(
Nom_Utilisateur
, mdp
, email
, telephone
, type_modification
)
SELECT Nom_Utilisateur
, mdp
, email
, telephone
, 'U'
FROM INSERTED AS I
WHERE LEN(I.mdp) < 7 -- La longueur du mot de passe est d'au moins 7 caractères
OR I.email NOT LIKE '%@%.%' -- l'email contient un arobase, mais aussi un point après cet arobase
OR I.telephone NOT LIKE '0[5-6]%' -- le numéro de téléphone commence par 05 ou 06
IF @@ROWCOUNT > 0
BEGIN
RAISERROR('Certains utilisateurs n''ont pas été modifiés car les données sont incorrectes', 10, 1)
END
END
END |
Partager