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 :

Problème avec un trigger + xp_cmdshell + executable


Sujet :

Développement SQL Server

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 77
    Points : 38
    Points
    38
    Par défaut Problème avec un trigger + xp_cmdshell + executable
    Bonjour,

    Je ne sais pas si je suis dans le bon forum pour poser cette question Mais je me lance.

    J'ai crée un trigger qui se déclanche après ajout d'une ligne dans une base de donnée et lorque le trigger est activé la base de donnée se plante.

    Voici l'historique de mes developpements :

    J'ai tester dans un premier temps cette appel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    declare @statement nvarchar(4000)
    declare @userno nvarchar(50) = 'test1'
    set @statement = '"C:\Log\test.exe" '+convert(nvarchar,115) +' '+@userno + ' Write'
     
    	 EXEC master ..xp_cmdshell @statement
    cette apple marche sans problème

    ensuite j'ai testé ce trigger :
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
     
    USE [Therefore]
    GO
    /****** Object:  Trigger [dbo].[TriggerSecurite]    Script Date: 06/03/2015 18:26:07 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
     
    -- =============================================
    -- Author:		<Author,,Name>
    -- Create date: <Create Date,,>
    -- Description:	<Description,,>
    -- =============================================
    create TRIGGER [dbo].[TriggerSecurite] 
       ON   [Therefore].[dbo].[TheCat48]
       AFTER insert
    AS 
    BEGIN
    declare @NomCat nvarchar(50) = 'Courrier Donges v2'
    declare @statement nvarchar(4000)
    declare @docno int = (select inserted .docno from inserted)
    declare @userno nvarchar(100) = (
    select ldap.login
     from therefore.dbo.LDAP ldap
     where LDAP.mail in ( select c49.Mail 
      FROM [Therefore].[dbo].[TheCat48] c48
      inner join Therefore .dbo.TheCat49 c49
      on c48.ID_Instruction =c49.ID
      where c48.docno = @docno )) 
      declare @catno int = (select [CtgryNo]
      FROM [Therefore].[dbo].[TheCategory]
      where name = @NomCat)
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    	SET NOCOUNT ON;
     
     
    END
    là aussi pas de problème.

    Par contre si je teste cette appel c'est le plantage.

    Voici le trigger :
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    USE [Therefore]
    GO
    /****** Object:  Trigger [dbo].[TriggerSecurite]    Script Date: 06/03/2015 18:26:07 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
     
    -- =============================================
    -- Author:		<Author,,Name>
    -- Create date: <Create Date,,>
    -- Description:	<Description,,>
    -- =============================================
    create TRIGGER [dbo].[TriggerSecurite] 
       ON   [Therefore].[dbo].[TheCat48]
       AFTER insert
    AS 
    BEGIN
    declare @NomCat nvarchar(50) = 'Courrier Donges v2'
    declare @statement nvarchar(4000)
    declare @docno int = (select inserted .docno from inserted)
    declare @userno nvarchar(100) = (
    select ldap.login
     from therefore.dbo.LDAP ldap
     where LDAP.mail in ( select c49.Mail 
      FROM [Therefore].[dbo].[TheCat48] c48
      inner join Therefore .dbo.TheCat49 c49
      on c48.ID_Instruction =c49.ID
      where c48.docno = @docno )) 
      declare @catno int = (select [CtgryNo]
      FROM [Therefore].[dbo].[TheCategory]
      where name = @NomCat)
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    	SET NOCOUNT ON;
     
     
    	set @statement = '"C:\Log\test.exe" '+convert(nvarchar,@DocNo) +' '+@userno + ' Write'   
     
    	 EXEC master ..xp_cmdshell @statement
     
        -- Insert statements for trigger here
     
    END
    Avez vous une idée du pourquoi ? l'exécutable fonctionne normalement et je fait générer des logs lorsqu'il plante.


    Merci de votre aide.

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    appeler un programme externe depuis un trigger est globalement une mauvaise idée. Que doit faire ce programme ?

    Par ailleurs, ce trigger sera appelé une seule fois si plusieurs lignes sont insérées en même temps. la pseudo table INSERTED contiendra alors plusieurs ligne, mais votre trigger ne prend le prend pas en compte.
    Quelle commande effectuez vous pour déclencher le trigger ?


    Citation Envoyé par PHPkoala Voir le message
    Par contre si je teste cette appel c'est le plantage.
    Quel est le message d'erreur ?

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 77
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Bonjour,

    appeler un programme externe depuis un trigger est globalement une mauvaise idée. Que doit faire ce programme ?
    il permet de changer la sécurité dans un logiciel tiers
    Par ailleurs, ce trigger sera appelé une seule fois si plusieurs lignes sont insérées en même temps. la pseudo table INSERTED contiendra alors plusieurs ligne, mais votre trigger ne prend le prend pas en compte.
    Quelle commande effectuez vous pour déclencher le trigger ?
    c'est le même logiciel tiers qui ajoute une ligne ou Update une ligne dans la table.

    Quel est le message d'erreur ?
    il n'y a pas de message d'erreur, il freeze et je doit redémarrer le service SQL puis supprimer le trigger pour qu'il refonctionne correctement. c'est ça qui est le plus dérangeant.

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Etes vous sûr que votre appel ne provoque pas lui-même une insertion dans la table ?
    Auquel cas ,ça tourne en boucle !

    Ou bien simplement une lecture dans cette table. Vous pourriez dans ce cas avoir un verrou mortel non détectable par le système, du fait de votre appel externe.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 77
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Etes vous sûr que votre appel ne provoque pas lui-même une insertion dans la table ?
    Auquel cas ,ça tourne en boucle !

    Ou bien simplement une lectuer dans cette table. Vous pourriez dans ce cas avoir un verrou mortel non détectable par le système, du fait de votre appel externe.
    c'est ce que j'ai pensé aussi, mais le programme tiers me donne un log avant exécution et la j'ai aucun log. Donc il lance l’exécutable et plus rien après.

  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 768
    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 768
    Points : 52 565
    Points
    52 565
    Billets dans le blog
    5
    Par défaut
    Il est parfaitement débile et profondément suicidaire de faire ce que vous faites. D'ailleurs vous l'avez constaté par vous même vous avez perdu le contrôle du serveur...
    1) le fait d'utiliser xp_cmdshell en production est FORTEMENT déconseillé. Il pose d'énorme problème de sécurité
    2) le fait de lancer un exécutable externe dans un déclencheur allonge la durée de verrouillage des tables en cours de mise à jour...
    3) xp_cmdshell attend le retour d'exécution de ce que vous avez lancé. Si ce programme n'envoie pas de message explicite, il attendra un temps infini... Et l'infini c'est long surtout vers la fin
    4) si l'exécutable externe relance des commandes SQL vers le SGBDR vous entrez dans une boucle sans fin dans lequel et l'exécutable et le SGBDR vont s'entretuer !

    Bref, décrivez nous en détail ce que vous voulez faire et nous vous trouverons une solution asynchrone et immédiate ! (par exemple en utilisant Service Broker)

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

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 77
    Points : 38
    Points
    38
    Par défaut
    Bon, j'ai bien vu et c'est vraiment suicidaire. je vais passer par une autre façon.
    Merci de vos conseille.

Discussions similaires

  1. Problème avec un trigger
    Par fayerne dans le forum PL/SQL
    Réponses: 2
    Dernier message: 13/01/2008, 00h36
  2. Réponses: 4
    Dernier message: 27/11/2007, 15h32
  3. probléme avec un trigger
    Par sofiane1111 dans le forum Oracle
    Réponses: 4
    Dernier message: 14/06/2007, 11h17
  4. Problème avec un trigger...
    Par nasgektw dans le forum Développement
    Réponses: 3
    Dernier message: 28/04/2006, 17h41
  5. [T-SQL] problème avec un trigger
    Par karine77 dans le forum Adaptive Server Enterprise
    Réponses: 3
    Dernier message: 26/09/2005, 10h45

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