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 actif
    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
    Points : 213
    Points
    213
    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
    Fabian M. - DBA Sql server 2008R2.
    Apprenti Admin Système 2008 R2
    Développeur SSRS, SQL
    Développement C# en hobby

  2. #2
    Membre actif
    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
    Points : 213
    Points
    213
    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
    Fabian M. - DBA Sql server 2008R2.
    Apprenti Admin Système 2008 R2
    Développeur SSRS, SQL
    Développement C# en hobby

  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 848
    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 848
    Points : 52 966
    Points
    52 966
    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 actif
    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
    Points : 213
    Points
    213
    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
    Fabian M. - DBA Sql server 2008R2.
    Apprenti Admin Système 2008 R2
    Développeur SSRS, SQL
    Développement C# en hobby

  5. #5
    Expert confirmé
    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
    Points : 4 043
    Points
    4 043
    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)
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

+ 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