Please leave me a comment if you have written or have seen a trigger that is written in such a way that it will send an email when a value changes in a table.
I am looking at the following question: Email trigger when data is changed
- ALTER TRIGGER [dbo].[RVABestellingenAantalWijzigenTrigger]
- ON [dbo].[RVA_Bestellingen]
- AFTER UPDATE
- AS
- --Vars
- DECLARE @body varchar(500)
- DECLARE @BestellingID int
- DECLARE @CategorieID int
- DECLARE @SubCategorieID int
- DECLARE @AantalOrigineel int
- DECLARE @AantalNieuw int
- DECLARE @LocatieNaam varchar(255)
- DECLARE @ComponentNaam varchar(255)
- DECLARE @CategorieNaam varchar(255)
- DECLARE @SubCategorieNaam varchar(255)
- DECLARE @Datum datetime
- if update(Aantal) /*and (SELECT Datum FROM inserted) = cast(floor(cast(dateadd(day,1,getdate()) as float)) as datetime) */ and (convert(varchar,getdate(),108)>'11:00')
- begin
- --Zetten aantallen
- SET @AantalOrigineel = (SELECT Aantal FROM deleted)
- SET @AantalNieuw = (SELECT Aantal FROM inserted)
- SET @BestellingID = (SELECT BestellingID FROM inserted)
- SET @CategorieID = (SELECT CategorieID FROM inserted)
- SET @SubCategorieID = (SELECT SubCategorieID FROM inserted)
- --Zetten locatienaam en componentnaam
- SELECT @LocatieNaam = ('RVA Aanpassingen Locatie: '+LocatieNaam), @ComponentNaam=OfficieleNaam, @Datum=Datum
- FROM RVA_Bestellingen r
- LEFT OUTER JOIN Locaties l on l.LocatieID = r.LocatieID
- LEFT OUTER JOIN Componenten c on c.ComponentID = r.ComponentID
- WHERE r.BestellingID = @BestellingID
- SELECT @CategorieNaam = Categorie
- FROM RVA_HoofdCategorie
- WHERE HoofdCategorieID = @CategorieID
- SELECT @SubCategorieNaam = Categorie
- FROM dbo.RVA_SubCategorie
- WHERE SubCategorieID = @SubCategorieID
- --Zet boyd
- SET @body = (
- SELECT
- 'HoofdCategorie: ' + @CategorieNaam+ char(10)+char(13)
- +'SubCategorie: ' + @SubCategorieNaam+ char(10)+char(13)
- + 'Componentnaam: '
- + @ComponentNaam + char(10)+char(13)
- + 'Origineel aantal: '
- + CAST(@AantalOrigineel as varchar(50) ) + char(10)+char(13)
- + 'Nieuw aantal: '
- + CAST(@AantalNieuw as varchar(50) ) + char(10)+char(13)
- + 'Leverdatum: ' +
- + convert(varchar(50),@Datum,105)
- )
- --Mailen naar Adeline
- EXEC master..xp_sendmail
- @recipients = 'fake@fake.fake',
- @message = @body,
- @subject = @LocatieNaam
- end
And I am just shaking my head, for one it doesn't take into account muliple rows being updated, see Best Practice: Coding SQL Server triggers for multi-row operations for more on that topic
The second bad thing is of course that you want your trigger to complete as fast as possible, you don't want it to email a bunch of people. What if the email blows up?
Ideally you would write a query inside the trigger that dumps the desired results into another table, then you would have a job that checks that table every minute or so and does the emailing.
Now I admit, I have written a trigger in the past that emailed when something got inserted, this was a table that would interact with Great Pains Plains. Once we decided to insert nine thousand rows as a stress test from a batch, and yes we brought down the whole exchange server, the email went out to I believe 20 people, this was the time of 3 MB inboxes :-)
Lastly this person is on SQL Server 2008 and is still using xp_sendmail and not sp_send_dbmail
Enough ranting, leave me a comment if you do send emails from withing triggers. If you do so, did you ever have any problems with it?
*** If you have a SQL related question try our Microsoft SQL Server Programming forum or our Microsoft SQL Server Admin forum






LTD Social Sitings
Note: Watch for social icons on posts by your favorite authors to follow their postings on these and other social sites.