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) ) goLorsque je fais un insert, delete, update, select par le requeteur cela fonctionne trés bien je n'ai aucun soucis.
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
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.
Partager