web-dev-qa-db-fra.com

Créer un travail pour envoyer une alerte à l'aide de sp_send_dbmail lorsque la valeur de la table est supérieure à x

PROBLÈME

Le SMScounter.Counter est utilisé pour accumuler l'utilisation d'un service. Le service a une casquette programmatique de 1000. J'aimerais alerter les utilisateurs lorsque cette casquette est violée.

tableau Créer

CREATE TABLE [dbo].[SMSCounter](
  [Counter] [int] NOT NULL,
  [CounterDate] [datetime] NOT NULL )

Exemple de données

380, 2012-09-10 00:00:00.000
177, 2012-10-14 00:00:00.000
999, 2012-11-16 00:00:00.000

Script de travail

Le script ci-dessous est ma tentative de créer un travail planifié qui vérifiera toutes les heures si le SMScounter.Counter est supérieur à 950.

USE DATABASEname
select (Counter) as CHECKVALUE from SMSCounter where smscounter.CounterDate  = DATEADD(dd, DATEDIFF(dd, 0, GETDATE()),0)    
IF CHECKVALUE > 950

BEGIN

EXEC msdb.dbo.sp_send_dbmail
  @recipients=N'[email protected]',
  @body='1000 Daily SMS cap near', 
  @subject ='1000 Daily SMS cap near',
  @profile_name ='SCOTT',
  @query =
    'USE DATABASEname
     (select * from SMSCounter where CounterDate = GETDATE())'

END

QUESTIONS

  1. Comment puis-je formater GETDATE pour examiner dd/mm/yy et ignorer la partie temporelle lors de la lecture SMScounter.CounterDate? (Script ci-dessus édité, fonctionne maintenant).

  2. Comment puis-je obtenir la déclaration IF pour travailler pour comparer CHECKVALUE à 950?

J'utilise SQL Server 2008 Standard Edition.

5
scott_lotus

La solution n'est pas mauvaise, mais j'aimerais vous présenter une fois plus réel. Au lieu de simplement vérifier le SMS comptoir toutes les heures, ne feriez-vous pas mieux savoir quand cela s'est passé pour la première fois?

Je ferais ce qui suit:

  • ajoutez une nouvelle colonne à votre table - Bit d'alerte non NULL par défaut 0 - qui détient des informations si le client a été alerté sur le nombre élevé de SMS. Ceci est nécessaire pour que le client ne soit alerté pour chaque insertion/mise à jour> 950, mais uniquement pour le premier.

  • ajoutez une gâchette sur votre table (après insertion et mise à jour) au cas où la valeur du compteur est plus grande que 950 démarrera l'alerte (définissez la colonne d'alerte sur 1 et envoyez un courrier électronique).

Le déclencheur ressemblerait à ce qui suit:

ALTER TRIGGER dbo.RaiseAlert
    ON  dbo.SMSCounter
AFTER INSERT, UPDATE
AS 
BEGIN
    SET NOCOUNT ON;
    declare
        @cnt int,
        @today DATE = cast(GETDATE() as DATE),
        @alert bit;

    select @cnt = n.[Counter], @alert = alert
    from inserted n
    where n.CounterDate = @today;

    if @cnt > 950 and @alert = 0
    begin
        update SMSCounter
        set Alert = 1
        from SMSCounter
        where CounterDate = @today;

        declare @subject varchar(1000);
        select @subject = 'The sms counter is near!! It''s value is: ' + CAST(@cnt as varchar);

        EXEC msdb.dbo.sp_send_dbmail @profile_name='SQLAlerts',
            @recipients = '[email protected]',
            @subject = @subject,
            @body = 'blablabla';
    end;
END
GO

Une mise à jour simple pourrait l'élever et envoyer le courrier électronique:

update SMSCounter
set [Counter] = 988
where CounterDate = '2012-11-16 00:00:00.000'
1
Marian

Je ne pouvais pas obtenir cela pour travailler avec le @query paramètre donc j'ai utilisé html à la place

Le script audit les utilisateurs de l'utilisation de "sa" ou de comptes de service

IF OBJECT_ID ('AuditSqlLogins') IS NOT NULL DROP TABLE AuditSqlLogins 
GO

CREATE TABLE AuditSqlLogins (
    [Counter] [int] IDENTITY(1,1) NOT NULL,
    [Login_name] [varchar](20) NULL,
    [Host_name] [varchar](20) NULL,
    [login_time] [datetime] NULL
) ON [PRIMARY]

INSERT INTO [dbo].[AuditSqlLogins]
    (login_time, login_name, Host_name )

    SELECT login_time, login_name, Host_name 
    FROM sys.dm_exec_sessions 
    WHERE Host_name not like '%APP%'  -- excludeds Apllication server logins
    and Host_name not like '%WWW%'    -- excludeds Web server logins
    and database_id = 5               -- Specify the database you want to audit
    and login_name = 'Appadmin'       -- specify the account you want audited
    or login_name = 'sa'
    ORDER BY Host_name desc

    DELETE FROM AuditSqlLogins
    WHERE Host_name is null

DECLARE @counter integer
SELECT @counter = Counter FROM AuditSqlLogins                         

IF (@counter > 0)
BEGIN 

DECLARE @xml NVARCHAR(MAX)

SET @xml = CAST ( ( SELECT 
          td = login_name  , '',
          td = Host_name, '',
          td = login_time,''

FROM AuditSqlLogins 

FOR XML PATH('tr'), TYPE 
              ) AS NVARCHAR(MAX) )
       DECLARE @body  nvarchar(max);
       SET @body ='
<html>
<body>
<head>
<style>
table {
  border-collapse: collapse;
}
table, th, td {
  border: 1px solid #ea5685;
}
</style>
</head>
<H3>Audit Appadmin and SA Login Event : (Server Name)</H3>  

<table border="1" cellspacing="0" border-spacing="0" style ="text-align:center"> 
<tr style="height:15px; background:#ea8686">
<th border-spacing="0" style="padding:5px 15px;">login_name</th>
<th border-spacing="0" style="padding:5px 15px;">Host_name</th>
<th border-spacing="0" style="padding:5px 15px;">login_time</th>
</tr>
'     
SET @body = @body+@xml+'</table><body>'

EXEC msdb.dbo.sp_send_dbmail
@recipients='[email protected]', 
       @subject = 'Audit itsadmin and SA Login Event',
       @body = @body,
       @body_format = 'HTML' ,
       @profile_name='Your DB Mail profile'        
END
DROP TABLE AuditSqlLogins
1