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 :

problème d'insertion dans une base SQL Server 2000 Via un trigger


Sujet :

MS SQL Server

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Avril 2009
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 2
    Points : 1
    Points
    1
    Par défaut problème d'insertion dans une base SQL Server 2000 Via un trigger
    Bonjour,
    je travaille sur la base BIJOU de Sage ligne 100, version SQL Server 2000 SP3.
    J'ai crée un trigger sur la table F_DOCENTETE. Au moment de l'exécution du déclencheur, je recois le message d'erreur suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    update a échoué car les options SET suivantes comportent des paramètres incorrectes : 'QUOTED_IDENTIFIER'
    .

    Au niveau de l'analyseur des requêtes, j'ai exécuté le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    sp_dboption 'Nom_Base_de_données','arithabort','TRUE'
    go
    sp_dboption 'Nom_Base_de_données','concat null yields null','TRUE'
    go
    sp_dboption 'Nom_Base_de_données','quoted identifier','TRUE'
    go
    sp_dboption 'Nom_Base_de_données','ANSI nulls','TRUE'
    go
    sp_dboption 'Nom_Base_de_données','ANSI padding','TRUE'
    go
    sp_dboption 'Nom_Base_de_données','ANSI warnings','TRUE'
    go
    sp_dboption 'Nom_Base_de_données','numeric roundabort','FALSE'
    go
    Voici le code de mon trigger:
    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
    [13:15:23] skon a dit : CREATE TRIGGER [CONTROL] ON [dbo].[F_DOCENTETE] 
    FOR INSERT
     
     AS
    SET ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, ARITHABORT,
    QUOTED_IDENTIFIER, ANSI_NULLS on
    SET NUMERIC_ROUNDABORT off
     
     
    DECLARE @UT as nvarchar (10)
    DECLARE @NB as nvarchar (10)
    DECLARE @PR as nvarchar (20)
    DECLARE @piece as nvarchar (13)
     
    --Sélectionner l'utilisateur connecté
    SET @UT= (SELECT DO_Ref  FROM  INSERTED)
    SET @piece= (SELECT DO_piece  FROM  INSERTED)
     
    --Vérification de l'existance de dépot pour l'utilisateur connecté
    SET @NB= (SELECT COUNT (*) FROM WS_USERDEPOT WHERE Utilisateur=@UT)
     
    IF  @NB>0
     
    BEGIN
    --Selectionner le depot principale de l'utilisateur
    SET @PR=(SELECT Depot FROM  WS_USERDEPOT WHERE Utilisateur=@UT and Principal=1)
    --Renvoyer le code du depot principal
     
    --Mettre a jour le depot
    UPDATE   F_DOCENTETE
    SET [DE_No] =  (SELECT DE_No FROM F_DEPOT WHERE DE_Intitule =@PR)
    WHERE F_DOCENTETE.DO_Piece= @piece
     
    END
     
     
     
    --Rollback en cas d'erreur
    IF @@Error <> 0
    ROLLBACK TRANSACTION
    Merci pour votre aide.

  2. #2
    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 : 43
    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,

    Je ne vois pas vraiment à quoi vous sert de positionner toutes ces options de session, au moins au niveau du trigger ...

    Avez-vous essayé en écrivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SET ANSI_PADDING ON
    SET ANSI_WARNINGS ON
    SET CONCAT_NULL_YIELDS_NULL ON
    SET ARITHABORT ON
    SET QUOTED_IDENTIFIER ON
    SET ANSI_NULLS ON
    SET NUMERIC_ROUNDABORT OFF
    Néanmoins votre trigger est faux puisqu'il n'est pas ensembliste.
    Je pense que la requête correspondante serait :

    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
    CREATE TRIGGER TR_A_I_F_DOCENTETE
    AS
    BEGIN
    	UPDATE dbo.F_DOCENTETE
    	SET DE_No = DEPOT.DE_No
    	FROM dbo.F_DOCENTETE AS ENTETE
    	JOIN dbo.F_DEPOT AS DEPOT ON ENTETE.DO_Piece = ENTETE.DO_Piece
    	JOIN dbo.WS_USERDEPOT AS USER_DEPOT ON DEPOT.DE_Intitule = USER_DEPOT.Depot
    	JOIN (
    			SELECT I.DO_Ref,
    					COUNT(*) AS NB
    			FROM INSERTED AS I
    			JOIN dbo.WS_USERDEPOT AS USER_DEPOT ON I.DO_Ref = USER_DEPOT.Utilisateur
    			GROUP BY I.DO_Ref HAVING COUNT(*) > 0
    		) TMP (DO_Ref, NB) ON USER_DEPOT.Utilisateur = TMP.DO_Ref
    	JOIN INSERTED AS I ON I.DO_Piece = ENTETE.DO_Piece
    	WHERE USER_DEPOT.Principal = 1
     
    	IF @@ERROR > 0
    	BEGIN
    		ROLLBACK TRANSACTION
    	END
    END
    Mais si vous nous fournissiez la structure des tables participant à la requête et ce que vous devez faire, je pourrais en être sûr

    @++

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Avril 2009
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par elsuket Voir le message
    Bonjour,

    Je ne vois pas vraiment à quoi vous sert de positionner toutes ces options de session, au moins au niveau du trigger ...

    Avez-vous essayé en écrivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SET ANSI_PADDING ON
    SET ANSI_WARNINGS ON
    SET CONCAT_NULL_YIELDS_NULL ON
    SET ARITHABORT ON
    SET QUOTED_IDENTIFIER ON
    SET ANSI_NULLS ON
    SET NUMERIC_ROUNDABORT OFF
    Néanmoins votre trigger est faux puisqu'il n'est pas ensembliste.
    Je pense que la requête correspondante serait :

    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
    CREATE TRIGGER TR_A_I_F_DOCENTETE
    AS
    BEGIN
    	UPDATE dbo.F_DOCENTETE
    	SET DE_No = DEPOT.DE_No
    	FROM dbo.F_DOCENTETE AS ENTETE
    	JOIN dbo.F_DEPOT AS DEPOT ON ENTETE.DO_Piece = ENTETE.DO_Piece
    	JOIN dbo.WS_USERDEPOT AS USER_DEPOT ON DEPOT.DE_Intitule = USER_DEPOT.Depot
    	JOIN (
    			SELECT I.DO_Ref,
    					COUNT(*) AS NB
    			FROM INSERTED AS I
    			JOIN dbo.WS_USERDEPOT AS USER_DEPOT ON I.DO_Ref = USER_DEPOT.Utilisateur
    			GROUP BY I.DO_Ref HAVING COUNT(*) > 0
    		) TMP (DO_Ref, NB) ON USER_DEPOT.Utilisateur = TMP.DO_Ref
    	JOIN INSERTED AS I ON I.DO_Piece = ENTETE.DO_Piece
    	WHERE USER_DEPOT.Principal = 1
     
    	IF @@ERROR > 0
    	BEGIN
    		ROLLBACK TRANSACTION
    	END
    END
    Mais si vous nous fournissiez la structure des tables participant à la requête et ce que vous devez faire, je pourrais en être sûr

    @++
    bonjour,
    D'abord,je vous remercie pour la qualité et rapidité de votre réponse.
    Pour les options de sessions,j'ai vérifier leurs activation via
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sp_dboption ‘BIJOU’,’nom_du_paramètre’
    j'ai essayé votre trigger.J'ai juste corrigé la première jointure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    JOIN dbo.F_DEPOT AS DEPOT ON DEPOT.DE_No = ENTETE.DE_No
    mais je reçoit le même message d'erreur.J'ai essayer de mettre a jour une autre colonne par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE dbo.F_DOCENTETE
    	Commentaires = DEPOT.DE_No
    et ça fonctionne parfaitement.Le même test est valide pour mon code aussi ,mais j'ai apprécié votre optimisation.
    Vous trouverez la structure des tables participant à la requête dans le fichier ci-joint.
    En faite j'ai développé une petite application en vb6 qui permet d'affecter des dépôts par utilisateurs (par défaut sage crée un dépôt nommée dépôt principale et l'affecte à tous les utilisateurs). Ensuite je l'ai intéger dans l'interface de sage. J'ai crée la table WS_USERDEPOT dans la base BIJOU de sage pour insérer,modifier ou supprimer ses affectations.Lorsque un utilisateur ouvre son session à sage et crée l'entête d'un document de vente ou achats, au moment de la validation le déclencheur doit récupérer l'utilisateur connecté (pour tester j'écris son nom dans le champs réference). Ensuite il doit vérifier s'il a des dépôts affectés dans la table WS_USERDEPOT.Si c'est le cas,le trigger doit lui affecter son dépôt principale (car un utilisateur peut avoir plusieurs dépôt dont un est principale) en mettant à jour le champ DE_No.Si non rien ne se passe.

    a+
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. probléme de requete SQl dans une base SQL Server
    Par sasuma dans le forum Développement
    Réponses: 7
    Dernier message: 09/05/2009, 18h09
  2. probleme d'insertion dans une base sql server
    Par brajae85 dans le forum ASP.NET
    Réponses: 18
    Dernier message: 18/09/2008, 00h09
  3. Réponses: 1
    Dernier message: 17/09/2008, 14h40
  4. problème d'insertion sur une BD SQL server 2000
    Par offspring140 dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 22/05/2006, 12h11
  5. connection à une base sql server 2000 via odbc
    Par donny dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 20/02/2006, 09h15

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