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 :

Récupérer la requête SQL exécutée en chaine de caractères ? [2014]


Sujet :

MS SQL Server

  1. #1
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2010
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2010
    Messages : 185
    Points : 167
    Points
    167
    Par défaut Récupérer la requête SQL exécutée en chaine de caractères ?
    Bonjour,
    J'ai une demande un peu spéciale à laquelle je n'ai pas pu répondre.

    Comment récupérer la requête SQL exécutée en chaine de caractères dans le trigger pour enregistrer l'action demandée comme action à faire ultérieurement ?

    Explication et Mise en situation :
    Code sql : 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
    CREATE FUNCTION fctMaFonction()
    RETURNS BIT
    AS
    BEGIN
    DECLARE @toto BIGINT
    SELECT @toto = COUNT(*) FROM tblUneAutreTable
    RETURN IIF(@toto > 10, 0, 1)
    END;
    GO
     
    CREATE TABLE tblSQLLater
    (
    ID UNIQUEIDENTIFIER DEFAULT NEWID(),
    nvcSQL NVARCHAR(MAX)
    )
     
    CREATE TABLE tblMaTable
    (
    ID UNIQUEIDENTIFIER DEFAULT NEWID(),
    intData INT
    )
    GO
     
    CREATE TRIGGER trgMaTable_AI ON tblMaTable AFTER INSERT AS
    IF fctMaFonction() = 0
    BEGIN
    INSERT INTO tblSQLLater (nvcSQL) VALUES (???)
    RAISERROR(N'La base de données est en cours de traitement, votre demande sera traitée automatiquement ultérieurement. Il n''est pas nécessaire de la refaire.')
    END
    GO

    Ce code est fait à la volée pour simplifier le code réel et se concentrer sur le besoin.

    Est-ce qu'il est possible de récupérer l'instruction SQL qui a lancé le trigger pour l'enregistrer et l'exécuter plus tard ?

    Merci pour vos réponses.

    P.S. : Je voudrais faire ça sur toutes mes tables ou presque, donc il n'est pas envisagé d'écrire chaque requête à la mano en chaine de caractères...

  2. #2
    Membre éclairé
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Points : 674
    Points
    674
    Par défaut
    Bonjour,

    Essayez de mettre un trace avec le profiler SQL vous récuperez les requetes executés sur votre instance.

    un peu d'aide : http://elsuket.developpez.com/tutori...-cote-serveur/

    Bon courage
    MCSA SQL SERVER |MCT | MVP Data Platform

  3. #3
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2013
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Octobre 2013
    Messages : 74
    Points : 160
    Points
    160
    Par défaut
    Bonjour,


    Le besoin, c'est de "mettre de côté" la donnée insérée, et de traiter les conséquences de cette insertion (contraintes d'intégrité référentielle) plus tard, c'est bien ça ? La donnée doit tout de même être insérée dans la table ?
    Le trigger est posé sur la table lors d'une insertion, pourquoi avez-vous besoin du code de la requête appelante ?

    Récupérer la requête appelante peut être délicat, surtout lorsque le client appelle une procédure ou exécute plusieurs requêtes dans une même transaction.


    Dans votre exemple, grâce à la pseudo table INSERTED dans le Trigger, vous pourriez récupérer les données correspondant aux lignes insérées, les insérer dans une table de staging. Puis, via une tâche asynchrone (un job SQL Server par exemple), consulter les lignes dans cette table de staging, effectuer les actions souhaitées, puis supprimer les lignes.

  4. #4
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2010
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2010
    Messages : 185
    Points : 167
    Points
    167
    Par défaut
    Bonjour,
    Effectivement le but de l'opération, mettre de coté la requête (qui doit de toute façon être exécutée) et surtout ne pas attendre l'autorisation de l'exécuter pour que l'application récupère la main rapidement...

    Seulement on m'a fait part d'une autre méthode non moins intéressante, lancer la requête (par une procédure stockée) en mode asynchrone, avec une boucle d'attente d'autorisation d'écriture de l'information avant la requête...

    Je vais regarder cela avant toute chose parce que je trouve l'idée plus simple à mettre en oeuvre...

    @Julien : Ca a l'air intéressant et je le garde sous le coude au cas où ou pour une prochaine fois

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 15/02/2007, 13h46
  2. Réponses: 4
    Dernier message: 14/11/2006, 19h03
  3. Pb sur SUM dans requête SQL exécutée sous VB
    Par MAKSIM dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 14/11/2006, 17h07
  4. Récupérer valeur requête SQL
    Par joquetino dans le forum VB 6 et antérieur
    Réponses: 14
    Dernier message: 10/08/2006, 15h23
  5. [D5][BDE][Multibase] Récupérer les requêtes SQL d'une TTable
    Par Escandil dans le forum Bases de données
    Réponses: 3
    Dernier message: 11/01/2006, 14h29

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