IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

Trigger sur vue avec appli dédiée


Sujet :

MS SQL Server

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut 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 : 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.

  2. #2
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Après reflexoin, j'ai décider de coder un programme en VB.Net pour simplement tester ma vue et son trigger.

    en faisant juste un "insert into...." avec les valeurs obligatoires.

    Et cela marche.

    Donc le problème vient bien de l'appli en question. Mais comment cela se fait ? comment peut-elle faire pour passer outre le trigger ?
    IL y a t'il d'autre méthode sur SQL serveur pour "tromper" l'appli ?


    merci pour la mise en forme, promis je le ferais plus ^^'

  3. #3
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    pour info les tables réels ont plus de 100 colonnes
    C'est là que se situe le vrai problème ...
    100 colonnes c'est une erreur grave de modélisation, et ce n'est pas indexable, donc vous aurez des performances médiocres ...

    Votre trigger n'est pas ensembliste, donc il est incorrect.
    Si j'ai bien compris il devrait être attaché à votre vue et non pas à la table client

    Voici votre trigger retranscrit de façon ensembliste :

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    CREATE TRIGGER TR_A_DIU_client
       ON  dbo.client
       INSTEAD OF INSERT,DELETE,UPDATE
    AS 
    BEGIN
    	----------------
    	-- sur un INSERT
    	----------------
    	IF EXISTS
    	(
    		SELECT *
    		FROM INSERTED
    	)
    	AND NOT EXISTS
    	(
    		SELECT *
    		FROM DELETED
    	)
    	BEGIN
    		INSERT INTO dbo.client
    		SELECT id,
    				etat,
    				nom
    		FROM INSERTED
     
    		INSERT INTO dbo.client2
    		SELECT id,
    				etat,
    				prenom
    		FROM INSERTED		
    	END
     
    	----------------
    	-- sur un DELETE
    	----------------
    	IF NOT EXISTS
    	(
    		SELECT *
    		FROM INSERTED
    	)
    	AND EXISTS
    	(
    		SELECT *
    		FROM DELETED
    	)
    	BEGIN
    		DELETE FROM dbo.client
    		FROM dbo.client AS C
    		JOIN DELETED AS D
    			ON D.id = C.id
    			AND D.etat = C.etat
     
    		DELETE FROM dbo.client2
    		FROM dbo.client2
    		JOIN DELETED AS D
    			ON D.id = C.id
    			AND D.etat = C.etat
    	END
     
    	----------------
    	-- sur un UPDATE
    	----------------
    	IF EXISTS
    	(
    		SELECT *
    		FROM INSERTED
    	)
    	AND EXISTS
    	(
    		SELECT *
    		FROM DELETED
    	)
    	BEGIN
    		UPDATE dbo.client
    		SET etat = I.etat,
    			nom = I.nom
    		FROM dbo.client AS C
    		JOIN DELETED AS D
    			ON C.id = D.id
    			AND C.etat = D.etat
    		JOIN INSERTED AS I
    			ON C.id = I.id
    			AND C.etat = I.etat
     
    		UPDATE dbo.client2
    		SET etat = I.etat,
    			prenom = I.prenom
    		FROM dbo.client AS C
    		JOIN DELETED AS D
    			ON C.id = D.id
    			AND C.etat = D.etat
    		JOIN INSERTED AS I
    			ON C.id = .id
    			AND C.etat = I.etat
    	END
    END
    Je doute également que votre vue porte le nom client car deux objets de base de données ne peuvent pas avoir le même nom : or vous avez déjà une table qui porte ce nom

    @++

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Je suis tout à fait d'accord avec vous sur la problématique du nombre de colonne.
    La 1er fois que j'ai vu la base de donnée, je suis devenue plus blanc que blanc.
    Il y a un gros problème d'optimisation. La base fait plus de 40Go et tout sur le même disque. la définition des types de donées et pas mal non plus...un chiffre=float.
    Mais ceci est un autre problème, passons.

    Je me suis tromper dans mon exemple, mes excuses.
    La table client est renommé en client_ori.
    La vue se nomme client et porte sur client1 et client2.
    J'ai editer le code plus haut pour faciliter la compréhension.

    Donc quand l'appli appel la vue client, cela remonte bien les infos des deux tables (client1 et client2).
    La vue fonctionne.

    Mais il y a un probleme sur l'insert,updated,delete au niveau de l'appli et pas au niveau du requeteur.

    voila

Discussions similaires

  1. Trigger sur vue
    Par amani1 dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 22/01/2014, 15h49
  2. [postgre] Trigger sur vue - héritage
    Par lynnaryas dans le forum PostgreSQL
    Réponses: 10
    Dernier message: 13/04/2012, 14h31
  3. [SQL SERVER 2K8] Droit lecture sur Vue avec Fonction
    Par 33Romain dans le forum Administration
    Réponses: 1
    Dernier message: 27/08/2009, 09h34
  4. Triggers sur insertion avec SQL Server 2005
    Par Naail dans le forum Développement
    Réponses: 14
    Dernier message: 01/07/2009, 15h23
  5. Pb Trigger sur vue
    Par cosminutza dans le forum Développement
    Réponses: 3
    Dernier message: 28/07/2003, 16h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo