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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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.