Bonjour dev-linus,
Il faudra assurer l’intégrité à coups de triggers :
Un trigger pour s’assurer que lors d’un INSERT dans la table X, chaque ligne insérée a bien une référence à Y ou Z ;
Un trigger pour s’assurer que lors d’un UPDATE de la table X, chaque ligne modifiée conserve toujours une référence à Y ou Z ;
Un trigger pour s’assurer que lors d’un DELETE de la table Y, chaque ligne de la table X conserve toujours une référence à Y ou Z ;
Un trigger pour s’assurer que lors d’un DELETE de la table Z, chaque ligne de la table X conserve toujours une référence à Y ou Z ;
Un trigger pour s’assurer que lors d’un UPDATE de la table Y, chaque ligne de la table X conserve toujours une référence à Y ou Z ;
Un trigger pour s’assurer que lors d’un UPDATE de la table Z, chaque ligne de la table X conserve toujours une référence à Y ou Z.
Exemple avec MS SQL Server.
Création des tables :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
CREATE TABLE X
(
KX CHAR(04) NOT NULL
, Q CHAR(04) NOT NULL
, FKX CHAR(04) NOT NULL
, CONSTRAINT X_PK PRIMARY KEY (KX)
) ;
CREATE TABLE Y
(
KY CHAR(04) NOT NULL
, B CHAR(04) NOT NULL
, C CHAR(04) NOT NULL
, CONSTRAINT Y_PK PRIMARY KEY (KY)
) ;
CREATE TABLE Z
(
KZ CHAR(04) NOT NULL
, H CHAR(04) NOT NULL
, J CHAR(04) NOT NULL
, CONSTRAINT Z_PK PRIMARY KEY (KZ)
) ; |
Un échantillon de triggers :
INSERT dans la table X :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
CREATE TRIGGER X_insert_tr ON X INSTEAD OF INSERT AS
DECLARE @Count AS INT, @Err AS VARCHAR(48)
SET @Count = (SELECT COUNT(*)
FROM INSERTED
WHERE FKX IN (SELECT KY
FROM Y
UNION
SELECT KZ
FROM Z)) ;
IF @Count = 0
BEGIN
SELECT 'Insert into table X : Erreur dintégrité' AS X, * FROM INSERTED
RAISERROR (@Err, 10, 1)
RETURN
END
ELSE
BEGIN
INSERT INTO X (KX, Q, FKX)
SELECT KX, Q, FKX
FROM INSERTED
END |
DELETE dans la table Y :
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
|
CREATE TRIGGER Y_delete_tr ON Y INSTEAD OF DELETE AS
DECLARE @Count AS INT, @Err AS VARCHAR(48)
SET @Count = (SELECT COUNT(*)
FROM X JOIN DELETED ON X.FKX = DELETED.KY) ;
IF @Count > 0
BEGIN
SET @Count = (SELECT COUNT(*)
FROM DELETED JOIN Z ON DELETED.KY = Z.KZ) ;
IF @Count = 0
BEGIN
SET @Err = 'Delete from table Y => Viol dintégrité'
SELECT @Err, * FROM DELETED
RAISERROR (@Err, 10, 1)
RETURN
END
END
ELSE
BEGIN
DELETE FROM Y
WHERE KY IN (SELECT DISTINCT KY
FROM DELETED)
END |
Partager