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 SQL Server avec Clause Where


Sujet :

Développement SQL Server

  1. #1
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Septembre 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

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

    Informations forums :
    Inscription : Septembre 2015
    Messages : 6
    Points : 4
    Points
    4
    Par défaut Trigger SQL Server avec Clause Where
    Bonjour,

    Je souhaiterai avoir votre aide pour créer un trigger sur SQL Server.

    Ma situation :

    J’ai une table dbo.ACTIONS, avec les colonnes : Action_ID, Person_ID, Pause_Code, Next_state.

    • J’aimerai créer un trigger qui envoie automatiquement une notification par mail à chaque fois qu’il y aura une ligne ajoutée dans la table dbo.ACTIONS dont la Pause_Code=2. Si le Pause_code !=2, je n’envoie pas une notification mail.

    • Deuxième point, 2min après l’insertion de la ligne, si le Next_State est toujours null (Next_State est initialisé à Null au moment de l’insertion), j’envoie une autre notification, dans le cas contraire, je n’ai pas besoin d’envoyer une notification (cas où Next_State not null)
    Merci d’avance pour votre aide.

  2. #2
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 239
    Points : 313
    Points
    313
    Par défaut
    Bonjour Tekkeur,

    Pour le premier point, c'est assez simple, il suffit de créer un trigger d'insertion. Grosso modo :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    create trigger TriggerEnvoiMail 
    ON TABLE 
    FOR INSERT
    as
    BEGIN
    DECLARE @LIGNE_INSEREE VARCHAR(30);
    SET @LIGNE_INSEREE = SELECT CHAMP_1 + '' + CHAMP_2 ... FROM inserted;
    EXEC msdb.dbo.sp_send_dbmail  
        @profile_name = 'PROFIL',  
        @recipients = 'EMAIL',  
        @body = 'CONTENU_EMAIL' + @LIGNE_INSEREE,  
        @subject = 'OBJET' ;  
    from inserted;
    Pour le second point . . . ne serait-il pas mieux de fonctionner grâce à un programme externe ? Gérer un "WAIT" dans un Trigger ne me semble pas idéal . . .

  3. #3
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Septembre 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

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

    Informations forums :
    Inscription : Septembre 2015
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Merci jcdentons,

    Mais le souci avec votre trigger là, ce que ça m' envoie de notification à chaque fois qu'il y aura une insertion de données sur la table, alors que ce que je voulais, ce qu'on ne m'envoie de notification que lorsque Pause_Code=2

  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
    Bonjour,

    Citation Envoyé par jcdentons Voir le message
    Gérer un "WAIT" dans un Trigger ne me semble pas idéal . . .
    en effet, ni même envoyer un mail. Les verrous restent posés durant l'éxécution du trigger, et si le serveur de messagerie est un peu long à répondre, cela créera de la contention.

    Il serait plus judicieux d'utiliser le service broker : le trigger empile un message lors de l'insertion d'une ligne qui vérifie les conditions définie, et un autre service récupère ces messages et les traite (envoi du mail et vérification des deux minutes)

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 761
    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 761
    Points : 52 547
    Points
    52 547
    Billets dans le blog
    5
    Par défaut
    pour info sp_send_db_mail utilise 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/ * * * * *

  6. #6
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Par ailleurs le trigger n'est pas ensembliste, donc il est incorrect.
    En effet, quand on ajoutera plusieurs lignes à la table, on n'aura qu'un seul e-mail qui correspondra aux valeurs de la dernière ligne du jeu de données ajouté à la table et qui correspond au filtre WHERE.

    Il faudrait donc, par exemple, générer une chaîne HTML qui présente une table HTML avec les valeurs qui correspondent.
    En utilisant la clause FOR XML, ça peut donner quelque chose comme :

    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
    DECLARE @html_body varchar(max)
    	, @html_table_header varchar(max)
    	, @html_table_footer varchar(max)
    	, @mail_subject varchar(128) = 'Sujet du mail';
     
    SELECT	@html_table_footer = '</table></body></html>'
    	, @html_table_header = '<html><head>' + 
    		'<style>
    	td {border: solid black 1px;padding-left:5px;padding-right:5px;padding-top:1px;padding-bottom:1px;font-size:11pt;}
    	tr.even {background-color:white;}
    	tr.odd {background-color:#eeeeee;}
    		</style>' + 
    		'</head>' + 
    		'<body><table cellpadding=0 cellspacing=0 border=0>' + 
    		'<tr bgcolor=#FFEFD8><td align=center><b>NomColonne1</b></td>' + 
    		'<td align=center><b>NomColonne2</b></td></tr>';
     
    SELECT	@html_body = 
    	(
    		SELECT		maColonne1 AS td
    				, maColonne2 AS td
    				, ...
    				, maColonneN AS td
    		FROM		INSERTED AS I
    		...
    		FOR		XML RAW('tr'), ELEMENTS
    	);
     
    IF @html_body IS NOT NULL AND LEN(@html_body) > 0
    BEGIN
    	SET @html_body = REPLACE(@html_body, '_x003D_', '=');
    	SET @html_body = REPLACE(@html_body, '_x0020_', ' ');
    	SET @html_body = REPLACE(@html_body, '<tr><TRRow>0</TRRow>', '<tr class="even">');
    	SET @html_body = REPLACE(@html_body, '<tr><TRRow>1</TRRow>', '<tr class="odd">');
     
    	SET @html_body = @html_table_header + @html_body + @html_table_footer;
     
    	EXEC msdb.dbo.sp_send_dbmail
    		@profile_name = '<PROFIL MAIL SQL>'
    		, @recipients = 'mail'
    		, @body = @html_body 
    		, @subject = @mail_subject
    		, @body_format = 'HTML'
    END
    @++

Discussions similaires

  1. Pb de requete SQL avec clauses WHERE dans une procédure stockée
    Par CocoLeNain dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 11/06/2010, 23h48
  2. [MySQL] Requête SQL avec clause where max
    Par younes371 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 01/12/2009, 09h21
  3. Connexion à SQL Server avec ASP
    Par ayobo dans le forum ASP
    Réponses: 3
    Dernier message: 25/05/2004, 17h06
  4. attaquer base sql server avec easyphp sous windows
    Par jarod71 dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 11/12/2003, 14h17
  5. Réponses: 3
    Dernier message: 18/11/2002, 16h36

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