23
janvier
2012
Alimenter plusieurs tables via une vue
janvier
2012
Un article de zinzineti
Pas de commentaires
On désire alimenter plusieurs tables via une vue.
--> la vue
CREATE VIEW V_Clients_Commandes (id_client,nom_client,tel_client,mobile_client,date_commande,etat_commande,date_livraison) AS
SELECT cli.IDClient,cli.NomClient,cli.Tel,cli.Mobilephone,com.DateCommande,com.EtatCommande,com.DateLivraison
FROM Clients cli inner join Commandes com
ON cli.IDClient = com.IDClient
--> Les tables
CREATE TABLE dbo.Clients(
IDClient int IDENTITY(1,1) NOT NULL PRIMARY KEY,
NomClient varchar(20) NULL,
Tel varchar(20) NULL,
Mobilephone [varchar](20) NULL
)
CREATE TABLE dbo.Commandes(
IDCommande int IDENTITY(1,1) NOT NULL PRIMARY KEY,
IDClient int NOT NULL,
EtatCommande varchar(20) NULL,
DateCommande datetime NULL,
DateLivraison datetime NULL,
CONSTRAINT FK_IDCLI FOREIGN KEY (IDClient) REFERENCES Clients(IDClient)
)
CREATE VIEW V_Clients_Commandes (id_client,nom_client,tel_client,mobile_client,date_commande,etat_commande,date_livraison) AS
SELECT cli.IDClient,cli.NomClient,cli.Tel,cli.Mobilephone,com.DateCommande,com.EtatCommande,com.DateLivraison
FROM Clients cli inner join Commandes com
ON cli.IDClient = com.IDClient
--> Les tables
CREATE TABLE dbo.Clients(
IDClient int IDENTITY(1,1) NOT NULL PRIMARY KEY,
NomClient varchar(20) NULL,
Tel varchar(20) NULL,
Mobilephone [varchar](20) NULL
)
CREATE TABLE dbo.Commandes(
IDCommande int IDENTITY(1,1) NOT NULL PRIMARY KEY,
IDClient int NOT NULL,
EtatCommande varchar(20) NULL,
DateCommande datetime NULL,
DateLivraison datetime NULL,
CONSTRAINT FK_IDCLI FOREIGN KEY (IDClient) REFERENCES Clients(IDClient)
)
–> Essaie d’insertion
INSERT INTO V_Clients_Commandes (nom_client,tel_client,mobile_client,date_commande,etat_commande,date_livraison)
VALUES ('ZINZINDOHOUE','0102XXXXXX','06XXXXXXXX',GETDATE(),'Non livrée',null)
VALUES ('ZINZINDOHOUE','0102XXXXXX','06XXXXXXXX',GETDATE(),'Non livrée',null)
–> échec de l’INSERT.
/*
Msg 4405, Niveau 16, État 1, Ligne 1
La vue ou la fonction ‘V_Clients_Commandes’ ne peut pas être mise à jour car la modification porte sur plusieurs tables de base.
*/
–> Solution : trigger INSTEAD OF INSERT sur la vue
CREATE TRIGGER TR_INSTEAD_INSERT_ON_V_Clients_Commandes
ON V_Clients_Commandes INSTEAD OF INSERT NOT FOR REPLICATION
AS
BEGIN
-- s'assurer qu'au moins une ligne est affectée
IF (@@ROWCOUNT > 0)
BEGIN
SET NOCOUNT ON;
BEGIN
-- Insertion dans la table Clients
INSERT INTO Clients (NomClient,Tel,Mobilephone)
SELECT i.nom_client,i.tel_client,i.mobile_client
FROM inserted i
END;
-- Insertion dans la table Commandes
BEGIN
INSERT INTO Commandes (IDClient,DateCommande,EtatCommande,DateLivraison)
SELECT SCOPE_IDENTITY(),i.date_commande,i.etat_commande,i.date_livraison
FROM inserted i
END
END
END
GO
--> Insertion dans les tables membres de la vue
INSERT INTO V_Clients_Commandes (nom_client,tel_client,mobile_client,date_commande,etat_commande,date_livraison)
VALUES ('ZINZINDOHOUE','0102XXXXXX','06XXXXXXXX',GETDATE(),'Non livrée',null)
--> Insertion OK : vérification
SELECT * FROM Clients
SELECT * FROM Commandes
ON V_Clients_Commandes INSTEAD OF INSERT NOT FOR REPLICATION
AS
BEGIN
-- s'assurer qu'au moins une ligne est affectée
IF (@@ROWCOUNT > 0)
BEGIN
SET NOCOUNT ON;
BEGIN
-- Insertion dans la table Clients
INSERT INTO Clients (NomClient,Tel,Mobilephone)
SELECT i.nom_client,i.tel_client,i.mobile_client
FROM inserted i
END;
-- Insertion dans la table Commandes
BEGIN
INSERT INTO Commandes (IDClient,DateCommande,EtatCommande,DateLivraison)
SELECT SCOPE_IDENTITY(),i.date_commande,i.etat_commande,i.date_livraison
FROM inserted i
END
END
END
GO
--> Insertion dans les tables membres de la vue
INSERT INTO V_Clients_Commandes (nom_client,tel_client,mobile_client,date_commande,etat_commande,date_livraison)
VALUES ('ZINZINDOHOUE','0102XXXXXX','06XXXXXXXX',GETDATE(),'Non livrée',null)
--> Insertion OK : vérification
SELECT * FROM Clients
SELECT * FROM Commandes
Les déclencheurs INSTEAD OF permettent de mettre à jour une vue multitable qui ne pouvaient être modifiée directement par INSERT
Happy query !
————————
Etienne ZINZINDOHOUE
————————