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 :

Accès à une table bloquée si trigger


Sujet :

MS SQL Server

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Juin 2010
    Messages : 210
    Points : 243
    Points
    243
    Par défaut Accès à une table bloquée si trigger
    Bonjour,

    Je me permet de venir vous questionner après avoir lu une multitude de site, blog et forum ne m'ayant pas vraiment avancé.

    Je vous explique mon problème.
    J'aimerais réaliser un trigger sur une table, qui lors d'une insertion, update, delete, me récupère la requête déclanchante du trigger.
    Le trigger écris dans une table Log la requête qui la déclenché.
    J'ai trouvé comment réaliser cela.

    Le vrai problème, celui qui m’amène, est le suivant :
    Lorsque je réalise, une requête d'insertion par exemple, depuis SSMS le trigger la reçois et écris dans la table Log.
    Mais une fois que j'exécute la requête depuis une application (le fonctionnement final donc), rien ne se passe. Il n'y a pas d'insertion et encore moins de réaction de la part du trigger.

    Pour récapituler :
    - Exécution de la requête depuis l'application, sans trigger, fonctionne.
    - Exécution de la requête depuis SSMS avec trigger, fonctionne.
    - Exécution de la requête depuis l'application avec trigger, ne fonctionne pas.

    Si le trigger est présent mais disable, cela fonctionne.

    J'ai essayé avec un trigger tout con (insérer un "hello" dans une table) le problème est le même.
    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
    USE [BASE]
    GO
    /****** Object:  Trigger [dbo].[LogMySQL]    Script Date: 11/10/2013 11:09:47 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER TRIGGER [dbo].[LogMySQL]
    ON [dbo].[MATABLE]
    AFTER INSERT, UPDATE, DELETE 
    AS
     
    BEGIN
     
    	insert into SQLLog (event_info) values ('Hello')
     
    END
    SSMS 2012
    Appli asp.net avec service web.

    Si quelqu'un à une idée sur ce qui pourrait bloquer la "discutions" je suis preneur.

    Merci.

  2. #2
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Hello,

    A la base visiblement tu as déjà un problème pour l'insertion.

    Quelle est ta requête d'insertion ? Quelle est la définition de table ?
    Est-ce que tu as mis une trace profiler pour voir ce qui se passait ?

    ++

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 810
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 810
    Points : 52 865
    Points
    52 865
    Billets dans le blog
    5
    Par défaut
    La table à tracer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CREATE TABLE T (C INT);
    GO
    la table de journalisation des transactions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE TABLE T_SQL_LOG
    (LOG_ID             BIGINT IDENTITY PRIMARY KEY
     LOG_TABLE          sysname,
     LOG_SCHEMA         sysname,
     LOG_SQL            NVARCHAR(max) NOT NULL,
     LOG_DATETIME       DATETIME2 DEFAULT GETDATE(),
     LOG_USER           sysname DEFAULT USER,
     LOG_SYSTEMUSER     sysname DEFAULT SYSTEM_USER)
    GO
    le déclencheur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE TRIGGER E_IUD 
    ON T
    AFTER INSERT, UPDATE, DELETE
    AS
    SET NOCOUNT ON;
     
    INSERT INTO T_SQL_LOG
    SELECT 'dbo', 'T', text
    FROM   sys.dm_exec_requests
           CROSS APPLY sys.dm_exec_sql_text(sql_handle) 
    WHERE  session_id = @@SPID;
    GO
    Cela dit vous constaterez que la requête tracée est celle du trigger et non la requête mère. Il n'y a pas de moyen simple de récupérer la requête qui a déclenchée le déclencheur. Il faut pour cela mettre en œuvre, soit le profiler SQL soit l'audit de bases de données et faire tout un travail de recoupement et récupération des données.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Juin 2010
    Messages : 210
    Points : 243
    Points
    243
    Par défaut
    Bonjour.

    Tout d'abord, merci d'avoir répondu et pour l’intérêt porté à mon sujet.
    Pour reprendre,
    En fait j'ai déjà récupéré la requête qui déclenche le trigger, mon problème n'est pas ici. Et je n'ai pas non plus de problème au niveau de mes requêtes.

    J'ai évolué au fil de mes tests.

    Les requêtes simple depuis l'appli s’exécute et déclenche le trigger.
    Les requêtes de types requêtes paramétrées, elle, ne s’exécute pas..

    J'ai déjà exécuté une trace et je vois bien les requêtes mais elles sont écrites avec des paramètres :@Param1, @Param2 ...

    Je vois bien dans le processus les requêtes demandé depuis l'appli qui sont en attente mais ne s'exécute jamais..

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Juin 2010
    Messages : 210
    Points : 243
    Points
    243
    Par défaut
    Bonjour,
    Juste pour signaler que nous avons mis la main sur le problème.
    Il venait du test de retour après le ExecuteQuery dans le code appli qui testais =1 Or nous étions à 2 maintenant.

    Cependant je suis partit sur plus ou moins autre chose.

    Quoiqu'il en soit, je tenais à vous remercier d'avoir pris part à mon problème et d'y avoir consacré un peu de temps.

  6. #6
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Ok donc le problème était bien applicatif

    ++

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Juin 2010
    Messages : 210
    Points : 243
    Points
    243
    Par défaut
    Oui,
    Merci encore d'avoir pris le temps de me répondre.
    Je vais mettre résolu.

    P.S : j'ai ouvert un autre poste qui fait suite à ce que je veux réaliser :

    http://www.developpez.net/forums/d13...-sql-variable/

    Si l'envie te prend de m'aider de nouveau ^^. Avec plaisir.

    Bonne journée et code à vous.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Accès à une Table Indexée (index composite) en VBA ACCESS
    Par Denis VERNON dans le forum Access
    Réponses: 1
    Dernier message: 21/04/2006, 18h47
  2. [POSTGRESQL - C#] Probleme d'accès à une table
    Par angusyoung34 dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 31/12/2005, 13h33
  3. problème droit accès à une table
    Par lio33 dans le forum Administration
    Réponses: 3
    Dernier message: 04/10/2005, 19h35
  4. Accès à une JDialog bloqué à cause d'un setModal()
    Par seiryujay dans le forum Agents de placement/Fenêtres
    Réponses: 15
    Dernier message: 21/07/2005, 14h39
  5. [ADO] [MSACCESS] Problème d'accès à une table nommée OF
    Par FredRaid dans le forum Bases de données
    Réponses: 3
    Dernier message: 15/02/2005, 17h22

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