Cet exemple montre comment se passer du mapping RO des outils tiers en faisant directement la couche objet au sein du SGBDR par l’implémentations de vues et de déclencheurs INSTEAD OFF… (exemples sous MS SQL Server)
Les tables en jeu :
CREATE TABLE T_PERSONNE_PRS
(PRS_ID INT NOT NULL IDENTITY PRIMARY KEY,
PRS_NOM CHAR(32) NOT NULL,
PRS_PRENOM VARCHAR(25));
CREATE TABLE T_EMPLOYE_EMP
(PRS_ID INT NOT NULL PRIMARY KEY,
EMP_MATRICULE CHAR(8) NOT NULL);
GO
-- la vue de synthèse :
CREATE VIEW V_PRS_EMP
AS
SELECT P.PRS_ID, PRS_NOM, PRS_PRENOM, EMP_MATRICULE
FROM T_PERSONNE_PRS AS P
LEFT OUTER JOIN T_EMPLOYE_EMP AS E
ON P.PRS_ID = E.PRS_ID
GO
-- le déclencheur INSTEAD OF INSERT :
CREATE TRIGGER E_IU_EMP
ON V_PRS_EMP
INSTEAD OF INSERT
AS
DECLARE @INSERT TABLE (PRS_ID INT,
PRS_NOM CHAR(32),
PRS_PRENOM VARCHAR(25),
EMP_MATRICULE CHAR(8));
DECLARE @ID INT;
SELECT @ID = IDENT_CURRENT('T_PERSONNE_PRS') + COUNT(*)
FROM inserted;
DBCC CHECKIDENT ('T_PERSONNE_PRS', RESEED , @ID);
WITH T AS
(SELECT @ID AS NID, PRS_NOM, PRS_PRENOM, EMP_MATRICULE,
ROW_NUMBER() OVER (ORDER BY PRS_NOM, PRS_PRENOM) AS N
FROM inserted)
INSERT INTO @INSERT
SELECT @ID - N, PRS_NOM, PRS_PRENOM, EMP_MATRICULE
FROM T;
SET IDENTITY_INSERT T_PERSONNE_PRS ON;
INSERT INTO T_PERSONNE_PRS (PRS_ID, PRS_NOM, PRS_PRENOM)
SELECT PRS_ID, PRS_NOM, PRS_PRENOM
FROM @INSERT;
SET IDENTITY_INSERT T_PERSONNE_PRS OFF;
INSERT INTO T_EMPLOYE_EMP
SELECT PRS_ID, EMP_MATRICULE
FROM @INSERT;
GO
-- l'insertion simultanée dans plusieurs tables par l'intermédiaire de la vue :
INSERT INTO V_PRS_EMP (PRS_NOM, PRS_PRENOM, EMP_MATRICULE)
VALUES ('Marcel', 'Dujonc', 'AABBCC'),
('Patrick', 'Duchmol', 'ZZYYYWW'),
('Arlette', 'Dutrou', '115599');
SELECT * FROM V_PRS_EMP
CQFD !
--------
Frédéric Brouard, SQLpro - ARCHITECTE DE DONNÉES, http://sqlpro.developpez.com/
Expert bases de données relationnelles et langage SQL. MVP Microsoft SQL Server
www.sqlspot.com : modélisation, conseil, audit, optimisation, tuning, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
Après la guerre mais ce qui différencie INSERT et UPDATE c’est la présence dans la pseudo table DELETED non ?
Et même des updates…. On peut même considérer que la différence entre INSERT et UPDATE est juste la présence ou non de la clef dans la table inserted.
A +
ça donne des idées pour faire aussi des DELETE en cascade !
A+
Etienne ZINZINDOHOUE