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
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).
Comment puis-je obtenir la déclaration IF
pour travailler pour comparer CHECKVALUE
à 950?
J'utilise SQL Server 2008 Standard Edition.
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'
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