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 :

Tables de log : Difficultés avec les triggers


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de StripMat
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2014
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 206
    Par défaut Tables de log : Difficultés avec les triggers
    Bonjour, je souhaite mettre en places certains triggers pour créer une gestion des logs. Je m'explique.

    Lors d'un insert sur une table, le trigger doit remplir deux tables avec certaines informations, seulement je ne sais pas comment récupérer certaines données. Il doit premièrement créé une ligne dans une table rassemblant toutes les actions éffectués (INSERT, UPDATE, DELETE ), seulement je cherches à récupérer la dernière requête d'un login donné, j'ai trouvé sur le net ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT sqltxt.text FROM sys.dm_exec_connections conn
    INNER JOIN sys.dm_exec_sessions sson 
    ON conn.session_id = sson.session_id
    CROSS APPLY sys.dm_exec_sql_text(most_recent_sql_handle) AS sqltxt
    WHERE sson.login_name = ORIGINAL_LOGIN()
    Seulement cette requête me retourne plusieurs résultats !
    Pièce jointe 148465

    Je cherche ici à récupérer seulement la troisième ligne, les autres sont automatiques et ne m'intéresse pas. Comment ne récupérer QUE la requête exécutée par ce compte de connexion ?

    En plus de récupérer certaines info permettant d'identifier l'auteur de la requête, je dois écrire dans une deuxième table plusieurs lignes quant aux actions effectuées à savoir le nom des collones modifiés/insérés, leurs valeur (ancienne et nouvelle si possible, sinon uniquement la valeur après modifications/ajout) et également l'ID du journal de log auquel il est attaché, pour obtenir quelque chose du genre :


    Nom : screeeee.png
Affichages : 383
Taille : 6,2 Ko

    Donc voila, je cherches à savoir ce qu'il est possible de faire avec les triggers, est-ce que dans mon cas le mieux est de tout mettre dans un seul trigger (qui écrit dans les deux tables) seulement je ne sais pas comment récupérer les informations qui viennent d'être inséré dans 'Relevés', ni comment récupérer l'ID du journal que le trigger créé (pour le lien FK entre Journal et Logs). Ou bien placer un deuxième trigger sur journal pour insérer dans la table Log.

    J'ai pas trouvé grand chose sur le net quant à la gestion des logs en base de donnée, évoluant sur une instance SQL Express, j'peux oublier le Profiler :/

    Des idées ?

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2008
    Messages
    699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Octobre 2008
    Messages : 699
    Par défaut
    J'avoue, j'ai pas tout lu.
    Mais en précisant la session avec @@SPID ça va pas mieux ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT sqltxt.text FROM sys.dm_exec_connections conn
    INNER JOIN sys.dm_exec_sessions sson 
    ON conn.session_id = sson.session_id
    CROSS APPLY sys.dm_exec_sql_text(most_recent_sql_handle) AS sqltxt
    WHERE sson.login_name = ORIGINAL_LOGIN() and conn.session_id=@@SPID

  3. #3
    Membre confirmé Avatar de StripMat
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2014
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 206
    Par défaut
    Effectivement, sa fonctionne, merci Donpi !

    Malheureusement je vais placer tout sa dans un trigger et lorsque j'éssai de rentrer un insert sur la table cible avec un utilisateur simple, SSMS me retourne une erreur : "L'utilisateur n'est pas autorisé à effectuer cette action", sûrement parceque le trigger va chercher des infos dans les tables systèmes :/

    Comment contourner cela ?

  4. #4
    Expert confirmé
    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 : 46
    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
    Par défaut
    Oui il faut avoir le privilège VIEW SERVER STATE pour faire cela qui est un privilège de niveau serveur. En admettant que tu donnes ce droit à tes utilisateurs, je ne pense pas que cela va marcher car la requête la plus récente récupérée ne sera pas ton INSERT, UPDATE ou DELETE mais l'exécution du trigger lui même ... à vérifier

    ++

  5. #5
    Membre confirmé Avatar de StripMat
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2014
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 206
    Par défaut
    Vous avez malheureusement raison mikedavem, la requête qui m'est retournée est la requête créant le trigger :/

    Une idée pour contourner ceci ? Peut-être récupérer l'avant-dernière requête ? Comment ?

    Une autre façon de faire ?

    Là j'avoue qu'a moins d'écrire directement depuis l'application métier, j'vois pas comment réaliser sa au niveau base de donnée avec des triggers

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    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 998
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par StripMat Voir le message
    Vous avez malheureusement raison mikedavem, la requête qui m'est retournée est la requête créant le trigger :/

    Une idée pour contourner ceci ? Peut-être récupérer l'avant-dernière requête ? Comment ?
    Vous ne pouvez pas faire comme cela. Si vous voulez la requête intégrale il faut utiliser Change Data Capture.

    Une autre façon de faire ?

    Là j'avoue qu'a moins d'écrire directement depuis l'application métier, j'vois pas comment réaliser sa au niveau base de donnée avec des triggers
    C'est pas possible, car seule la requête actuelle, celle du trigger sera vue. La requête précédente est peut être conservée, mais sans le contexte de l'utilisateur qui l'a lancée.

    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/ * * * * *

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

Discussions similaires

  1. problème avec les triggers
    Par jakcam dans le forum Administration
    Réponses: 4
    Dernier message: 04/03/2008, 11h37
  2. difficulté avec les modules .pyd
    Par ulysse07 dans le forum Bibliothèques tierces
    Réponses: 4
    Dernier message: 12/09/2007, 11h17
  3. Difficulté avec les Radio button
    Par toitonline dans le forum Interfaces Graphiques
    Réponses: 8
    Dernier message: 17/04/2007, 17h58
  4. [C#] Difficulté avec les catch
    Par Roach- dans le forum ASP.NET
    Réponses: 9
    Dernier message: 31/01/2006, 17h57

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