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

Développement SQL Server Discussion :

Connaitre l'origine d'une requète sur une table via un trigger


Sujet :

Développement SQL Server

  1. #1
    Membre expérimenté
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2007
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 193
    Par défaut Connaitre l'origine d'une requète sur une table via un trigger
    Bonjour,

    Mon problème est assez simple, mais par contre je n'ai aucune idée d'ou aller trouver la réponse.

    Ce que je dois faire

    J'ai une table X.

    Sur cette table X un trigger Instead of delete qui
    lorsque l'on efface une donnée au lieu de l'effacer, va la copier dans une autre table et ensuite le supprimer.
    Jusque la c'est je dirais facile et y arrive très bien.

    La ou ça se complique est que je veux savoir l'utilisateur qui a effectuer cette action, la je pense que je peux toujours m'en tirer, car après tout l'utilisateur qui a effectué l'action de delete est aussi celui qui a déclenché mon trigger, donc avec un peu de recherche je devrais pouvoir le faire.

    Par contre j'aimerais bien aussi connaitre la requète d'origine qui a déclenché ce delete et de ce coté la je n'ai aucune idée de quelle table système utiliser

    Merci d'avance de votre aide

  2. #2
    Membre expérimenté
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2007
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 193
    Par défaut
    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
    ALTER TRIGGER [dbo].[DeleteTable1]
       ON  [dbo].[Table1]
       AFTER DELETE
    AS 
    BEGIN
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    	SET NOCOUNT ON;
    	declare @hostname varchar(250),
    	@net_address varchar(250)
     
    	select @hostname = hostname, @net_address = net_address from  master.dbo.sysprocesses where spid = @@SPID
    	insert into table2 select *, @hostname, @net_address from deleted
        -- Insert statements for trigger here
     
    END
    Voilà actuellement le look de mon trigger, si certains en avait besoin, il permet déjà d'avoir le pid et donc de retrouver le hostname et la macadresse de celui qui exécute un delete sur ma table.

    Je pars a la recherche d'un moyen d'obtenir la requète qui a déclenché le curseur, si je trouve qqch je le posterai ici

  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 996
    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 996
    Billets dans le blog
    6
    Par défaut
    il faut récupérer le SQL handle de, la table système des process. Comme vous n'avez pas indiqué la version de SQL Server difficile de vous en dire plus.

    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 expérimenté
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2007
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 193
    Par défaut
    oups oui désolé, sql server 2005

    je suis arrivé a me débrouillé pour avoir qqch qui marche, mais c'est boiteux
    Ca nous convient car c'est pour gérer des situations exceptionnelles mais le trigger ci plus bas présente bcp de faiblesse (utilisation de dbcc, update a l'aveuglette supposant qu'il n'y a pas de delete simultané)

    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
    create table zcmd_table1(id int identity(1,1), hostname varchar(250), macaddress varchar(250),
    EventType varchar(250), Parameters int, EventInfo varchar(max))
     
    Create TRIGGER [dbo].[table1delete]
       ON  [dbo].[table1]
       AFTER DELETE
    AS 
    BEGIN
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    	SET NOCOUNT ON;
    	declare @hostname varchar(250),
    	@net_address varchar(250)
     
    	select @hostname = hostname, @net_address = net_address from  master.dbo.sysprocesses where spid = @@SPID
    	insert into ZDel_DLVE select *, @hostname, @net_address from deleted
     
    	insert into zcmd_table1(EventType, Parameters, EventInfo) exec('DBCC inputbuffer(@@SPID)')
    	update zcmd_table1 set hostname = @hostname, macaddress = @net_address where id = (select max(id) from zcmd_table1)
     
     
    END
    Je vais regarder du coté du sql handle, histoire d'avoir un trigger correct

  5. #5
    Membre Expert
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    DECLARE @Handle binary(20)
    SELECT @Handle = sql_handle FROM sys.sysprocesses WHERE spid = @@SPID
    SELECT * FROM ::fn_get_sql(@Handle)

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

Discussions similaires

  1. Remplacer une requête sur une class par une valeur constante ?
    Par Lillie CHARLOTTE dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 02/06/2015, 09h59
  2. [Toutes versions] Faire en VBA une requête sur une requête paramétrée
    Par guidav dans le forum VBA Access
    Réponses: 3
    Dernier message: 15/02/2012, 17h10
  3. Réponses: 1
    Dernier message: 30/08/2011, 09h53
  4. Tri d'une requête sur une valeur ou une autre
    Par mims1664 dans le forum Requêtes
    Réponses: 2
    Dernier message: 21/08/2009, 17h40
  5. Réponses: 4
    Dernier message: 01/04/2008, 10h53

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