Trigger sur vue avec appli dédiée
Bonjour à tous.
Je travaille avec une application en VB6 dont je ne posséde pas les sources.
Cette appli interroge une base de données SQL serveur 2000.
Je voudrait optimiser la base et pour cela je doit "séparer" une table en deux, et tromper l'appli. (pour info les tables réels ont plus de 100 colonnes)
Pour faire un exemple voici ma méthode :
- je créé mes deux tables
- je créé une vue dessus
- je crée un trigger sur cette vue
Ce qui suit n'est q'un exemple qui reflete la méthode employée.
la table client d'origine :
Code:
1 2 3 4 5 6 7 8
| create table ori_client
(
id int,
etat int,
nom varchar(20) not null,
prenom varchar(20) not null
constraint [PK_client] primary key ( id,etat)
) |
Ma séparation en deux
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| create table client1
(
id int,
etat int,
nom varchar(20) not null
)
go
create table client2
(
id int,
etat int,
prenom varchar(20) not null
constraint [PK_client2] primary key ( id,etat)
)
go |
Code:
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
| --creation de la vue client
create view client as
select A1.id,A1.etat,A1.nom,A2.prenom
from client1 A1,client2 A2
where A1.id=A2.id and A1.etat=A2.etat
go
CREATE TRIGGER T_client
ON client
INSTEAD OF INSERT,DELETE,UPDATE
AS
BEGIN
declare @id int
declare @del_id int
declare @etat int
declare @del_etat int
declare @nom varchar(20)
declare @prenom varchar(20)
-- sur un insert
if exists(select * from inserted) and not exists(select * from deleted)
begin
select @id=id,@etat=etat,@nom=nom,@prenom=prenom from inserted
insert into client1 select @id,@etat,@nom
insert into client2 select @id,@etat,@prenom
end
-- sur un delete
else if not exists(select * from inserted) and exists(select * from deleted)
begin
select @del_id=id,@del_etat=etat from deleted
delete client1 where id=@del_id and etat=@del_etat
delete client2 where id=@del_id and etat=@del_etat
end
-- sur un update
else if exists(select * from inserted) and exists(select * from deleted)
begin
select @id=id,@etat=etat,@nom=nom,@prenom=prenom from inserted
select @del_id=id,@del_etat=etat from deleted
update client1 set etat=@etat,nom=@nom where id=@del_id and etat=@del_etat
update client2 set etat=@etat,prenom=@prenom where id=@del_id and etat=@del_etat
end
END
GO |
Lorsque je fais un insert, delete, update, select par le requeteur cela fonctionne trés bien je n'ai aucun soucis.
Mais si je passe par l'appli ca ne marche pas.
J'ai l'impression que l'appli ne tient pas compte du trigger de la vue, car il insere les données dans la table client. Pour la table client2 id et état sont null, prenom quand à lui est bien renseigné.
Il y a t-il un moyen de contourner ce problème ? mauvais paramètrage de la vue ou du trigger ?
Merci.