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 :

Trigger à l'insertion qui lance un programme


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 101
    Points : 58
    Points
    58
    Par défaut Trigger à l'insertion qui lance un programme
    Bonjour à tous,

    Pour commencer, je préfère vous prévenir, je suis une quiche finie et je n'y connais vraiment rien en SQL
    Voilà, ça, c'est fait.

    Préambule : je suis sous MS server 2008

    Je souhaiterais mettre en place un trigger sur une table qui, à chaque fois qu'une ligne est insérée lancera un programme.
    Quand je clique sur "New trigger..." dans la table concernée j'ai ce code qui apparait :
    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
    -- ================================================
    -- Template generated from Template Explorer using:
    -- Create Trigger (New Menu).SQL
    --
    -- Use the Specify Values for Template Parameters 
    -- command (Ctrl-Shift-M) to fill in the parameter 
    -- values below.
    --
    -- See additional Create Trigger templates for more
    -- examples of different Trigger statements.
    --
    -- This block of comments will not be included in
    -- the definition of the function.
    -- ================================================
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author:		<Author,,Name>
    -- Create date: <Create Date,,>
    -- Description:	<Description,,>
    -- =============================================
    CREATE TRIGGER <Schema_Name, sysname, Schema_Name>.<Trigger_Name, sysname, Trigger_Name> 
       ON  <Schema_Name, sysname, Schema_Name>.<Table_Name, sysname, Table_Name> 
       AFTER <Data_Modification_Statements, , INSERT,DELETE,UPDATE>
    AS 
    BEGIN
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    	SET NOCOUNT ON;
     
        -- Insert statements for trigger here
     
    END
    GO
    Que dois-je ajouter si je souhaite par exemple lancer le programme : "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" ?

    Désolé si ce n'est pas très clair mais je ne suis vraiment pas doué et merci à tous pour le temps que vous m'aurez accordé.

    Bonne fin de journée,

    Farid

  2. #2
    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 577
    Points
    52 577
    Billets dans le blog
    5
    Par défaut
    Vous feriez mieux de ne pas le faire, car chrome.exe sera lancé pour l'utilisateur du moteur SQL qui, comme c'est un compte système, ne l'affichera nulle part, mais générera de l'occupation mémoire, un thread perdu et figera peut être votre process pour l'éternité !

    Et comme disait Woody Allen, "l'éternité, c'est long, surtout vers la fin...."

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

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 101
    Points : 58
    Points
    58
    Par défaut
    Ah non, ce n'est qu'un exemple...

    Je ne souhaite pas lancer Chrome mais une base Access qui effectuera un traitement et se refermera aussi sec.

    Le problème reste le même ?

    Merci,

    Farid

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 101
    Points : 58
    Points
    58
    Par défaut
    J'espère que ce que je demande est possible parce que je suis vraiment dans une grosse galère là.

    Dans tous les cas, merci pour votre aide.

    Farid

  5. #5
    Invité
    Invité(e)
    Par défaut
    Quand j'étais stagiaire il y a 15 ans, j'avais fait un bricolage un peu analogue sur oracle et forms : un procédure PL/SQL lançait et fabriquait un fichier excel qui récupérait des données dans la bd par vb. Il était ensuite stocké temporairement puis envoyé et affiché sur le poste client.
    Ça marchait pas trop mal en DEV. Il y avait certains cas où le programme Excel.exe ne se fermait pas...
    Je n'étais plus là pour la production, donc je ne peux confirmer si c'était totalement viable.
    Maintenant, je ferais ça différemment, notamment, la partie traitement sur un machine distincte, histoire de ne pas plomber toute la prod avec ces .exe qui ne s'arrête pas.

  6. #6
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 101
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par 7gyY9w1ZY6ySRgPeaefZ Voir le message
    Quand j'étais stagiaire il y a 15 ans, j'avais fait un bricolage un peu analogue sur oracle et forms : un procédure PL/SQL lançait et fabriquait un fichier excel qui récupérait des données dans la bd par vb. Il était ensuite stocké temporairement puis envoyé et affiché sur le poste client.
    Ça marchait pas trop mal en DEV. Il y avait certains cas où le programme Excel.exe ne se fermait pas...
    Je n'étais plus là pour la production, donc je ne peux confirmer si c'était totalement viable.
    Maintenant, je ferais ça différemment, notamment, la partie traitement sur un machine distincte, histoire de ne pas plomber toute la prod avec ces .exe qui ne s'arrête pas.
    Et du coup comment je peux faire pour lancer ma BdD, tu sais lorsqu'une ligne est insérée dans la table, tu as une idée ?

  7. #7
    Invité
    Invité(e)
    Par défaut
    Si j'interprète ton besoin, en fait, tu cherches à te connecter à une bd access ?
    Si c'est ça, tu as diverses façons :
    • les linked servers
    • openquery
    • j'en oublie, c'est sûr.

  8. #8
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 101
    Points : 58
    Points
    58
    Par défaut
    Merci pour ta réponse.

    Non je ne cherche pas à me connecter à une base Access mais à lancer son exécution à chaque fois qu'une ligne est insérée dans une table d'une base SQL Server.

  9. #9
    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 577
    Points
    52 577
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Faridpo Voir le message
    Merci pour ta réponse.

    Non je ne cherche pas à me connecter à une base Access mais à lancer son exécution à chaque fois qu'une ligne est insérée dans une table d'une base SQL Server.
    Je pense que vous ne vous rendez pas compte des dégâts que vous allez causer !!!!

    En effet dans un déclencheur, vous êtes à l'intérieur d'une transaction et les tables manipulées pour cette transaction seront verrouillées pendant toute la durée du traitement externe, donc inaccessible au moindre utilisateur !
    Vos utilisateurs vont donc devoir attendre et les timeout vont se multiplier ainsi que les verrous mortels... Vous serez alors devenu le meilleur ennemis de tous vos utilisateurs, en attendant que votre chef de projet vous vire !

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

  10. #10
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 101
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Je pense que vous ne vous rendez pas compte des dégâts que vous allez causer !!!!

    En effet dans un déclencheur, vous êtes à l'intérieur d'une transaction et les tables manipulées pour cette transaction seront verrouillées pendant toute la durée du traitement externe, donc inaccessible au moindre utilisateur !
    Vos utilisateurs vont donc devoir attendre et les timeout vont se multiplier ainsi que les verrous mortels... Vous serez alors devenu le meilleur ennemis de tous vos utilisateurs, en attendant que votre chef de projet vous vire !
    A +
    J'ai bien compris tout cela mais cette table est utilisée entre 5 et 10 fois (grand maximum si le vent est favorable par jour) et le traitement que je souhaite lancer ne dure pas plus de 10 secondes.

    A plus,

    Farid

  11. #11
    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 577
    Points
    52 577
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Faridpo Voir le message
    J'ai bien compris
    Non, je ne pense pas !!!!
    tout cela mais cette table est utilisée entre 5 et 10 fois (grand maximum si le vent est favorable par jour) et le traitement que je souhaite lancer ne dure pas plus de 10 secondes.
    10 seconde là ou en principe vous devriez avoir un traitement qui dure moins de 1 milliseconde, c'est juste 10000 fois 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/ * * * * *

  12. #12
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 101
    Points : 58
    Points
    58
    Par défaut
    D'accord.

    Merci,

    Farid

  13. #13
    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

    Comme l'a indiqué SQLPRo, c'est en effet une très mauvaise idée de faire comme ceci.

    Avez-vous vraiment besoin d'un processus synchrone ?

    Vous pourriez par exemple utiliser le service broker pour faire exécuter votre tache par une application tierce, idéalement située ailleurs que sur le serveur SQL de production !

    Pouvez-vous nous en dire plus sur cette tache "access" et son contexte ? on pourra sans doute mieux vous aider pour trouver des alternatives.

  14. #14
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 101
    Points : 58
    Points
    58
    Par défaut
    Bonjour,

    J'ai bien pris note de ce que m'a dit SQLPro et j'ai abandonné cette piste. Je n'y connais rien donc si un expert en la matière me dit de ne pas le faire, je l'écoute.

    Cette base Access me sert à récupérer les adresses e-mails qui sont insérées dans la table SQL afin d'envoyer un e-mail en direct.

    Peut-être y a-t-il un moyen de tout faire depuis Access en attachant la table avec un code VBA ?

    Merci pour votre aide,

    Farid

  15. #15
    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 577
    Points
    52 577
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Faridpo Voir le message
    Peut-être y a-t-il un moyen de tout faire depuis Access en attachant la table avec un code VBA ?
    C'est déja nettement moins mauvais, car tu n'auras pas le blocage du à la transaction.

    Maintenant l'envoi d'un mail n'est jamais garanti, de même que ça réception. Cela reste strictement asynchrone et c'était grande bêtise que de vouloir faire du synchrone avec un processus qui par nature est asynchrone.

    Une autre solution est de faire un envoi retardé en alimentant une table des d'envois de mails à effectuer et de lancer une tache récurrente d'envoi par l'intermédiaire de l'Agent SQL.

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

  16. #16
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 101
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Une autre solution est de faire un envoi retardé en alimentant une table des d'envois de mails à effectuer et de lancer une tache récurrente d'envoi par l'intermédiaire de l'Agent SQL.
    A +
    J'ai besoin que les mails partent en "temps réel" ; c'est à dire quelques secondes après l'ajout d'une ligne dans la table. Peut-être existe-t-il un moyen en VBA de suppléer l'absence de déclencheur d'Access 2007 ? Je vais chercher.

    Merci pour votre aide.

    Farid

  17. #17
    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 577
    Points
    52 577
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Faridpo Voir le message
    J'ai besoin que les mails partent en "temps réel" ; c'est à dire quelques secondes après l'ajout d'une ligne dans la table.
    Alors service broker sera la meilleur solution, car asynchrone au fil de l'eau et surtout très rapide.

    Lisez le petite exemple d'introduction que j'ai fait avec SB : http://blog.developpez.com/sqlpro/p7...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/ * * * * *

  18. #18
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 101
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Alors service broker sera la meilleur solution, car asynchrone au fil de l'eau et surtout très rapide.
    Lisez le petite exemple d'introduction que j'ai fait avec SB : http://blog.developpez.com/sqlpro/p7...service_broker
    A +
    Effectivement, ça semble être la solution.

    Je vais essayer de comprendre tout cela pour le faire fonctionner.

    Merci pour votre aide,

    Farid

Discussions similaires

  1. Réponses: 7
    Dernier message: 28/04/2009, 16h05
  2. Script Shell qui lance un programme sur un ordi distant avec SSH
    Par bilibou dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 02/06/2007, 11h18
  3. Réponses: 11
    Dernier message: 30/10/2006, 16h59
  4. Un programme qui lance quelquechose toute les 50 minutes?
    Par altadeos dans le forum C++Builder
    Réponses: 4
    Dernier message: 12/03/2006, 11h16
  5. Réponses: 11
    Dernier message: 20/12/2005, 18h40

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