Event Notification para kill


i-see-dead-people-you-must-be-new-hereAlgum tempo atras fiz um post sobre Event Notification para monitorar DeadLock o que funciona muito bem,,,

Com um pouco de modificação o mesmo código pode ser utilizado para muitas outras coisas,,, por exemplo: limitar acesso a uma instância bloqueando a conexão do usuário…

Aí você pensa: “posso fazer isso por trigger, por que fazer diferente?”

Eu respondo,,, se você trabalha em ambientes com alto volume de conexões, ou ambientes que as vezes sofrem com falta de recursos como cpu ou memória sabe que a trigger pode ser uma pedra no sapato,,, ao invés de respeitar o filtro e impedir apenas algumas conexões ela bloqueia tudo e todos…

Já com o Event Notification é o contrário,,, no pior cenário ele só para de funcionar…

Os dois pontos que vejo como mais complicados são:

  • Não é possível personalizar uma mensagem para o usuário que sofreu o kill
  • Dependendo do que você fizer, ele pode começar a encher o errorlog com mensagens de kill

com o código abaixo consegui chegar a 20.000 tentativas de conexão simultâneas e nenhuma conseguiu conectar,,,


--apenas para constatar quais tipos de eventos podemos tratar... o que queremos eh o audit_login
select * from sys.event_notification_event_types with (nolock)
where type_name like '%login%'
use master
go

alter database BASE_DE_ADMINISTRACAO_DO_DBA set enable_broker with rollback immediate
go

alter database BASE_DE_ADMINISTRACAO_DO_DBA set TRUSTWORTHY on
go

use BASE_DE_ADMINISTRACAO_DO_DBA
go

CREATE QUEUE [Login_Killer_Queue]
GO

CREATE SERVICE [Login_Killer_Service]
AUTHORIZATION [dbo]
ON QUEUE [dbo].[Login_Killer_QUEUE]
([http://schemas.microsoft.com/SQL/Notifications/PostEventNotification])
GO
CREATE ROUTE Login_Killer_Route
WITH SERVICE_NAME = 'Login_Killer_Service',
ADDRESS = 'LOCAL';
GO
DECLARE @AuditServiceBrokerGuid [uniqueidentifier]
,@SQL [varchar](max);

-- Pega o service broker guid da base de dados
SELECT @AuditServiceBrokerGuid = [service_broker_guid]
FROM [master].[sys].[databases]
WHERE [name] = 'ADM_BDADOS'

-- Cria e executa o SQL dinamico para criar o objeto do evento de notificacao
SET @SQL = 'IF EXISTS (SELECT * FROM sys.server_event_notifications
WHERE name = ''Login_Killer_Notification'')

DROP EVENT NOTIFICATION Login_Killer_EventNotification ON SERVER

CREATE EVENT NOTIFICATION Login_Killer_EventNotification
ON SERVER
WITH fan_in
FOR AUDIT_LOGIN
TO SERVICE ''Login_Killer_Service'', '''
+ CAST(@AuditServiceBrokerGuid AS [varchar](50)) + ''';'
EXEC (@SQL)
GO
SELECT * FROM [sys].[server_event_notifications]

select * from sys.server_event_session_actions with (nolock)
CREATE TABLE [dbo].[DBA_FailedConnectionTracker](
[host_name] [varchar](128) NOT NULL,
[login_name] [varchar](128) NOT NULL,
[spidu] int,
[FailedLoginData] XML
) ;

CREATE PROCEDURE dbo.spc_DBA_FailedConnectionTracker
AS
BEGIN
SET NOCOUNT ON;
-- looping infinito
WHILE (1 = 1)
BEGIN
DECLARE @messageBody VARBINARY(MAX);
DECLARE @messageTypeName NVARCHAR(256);
WAITFOR (
RECEIVE TOP(1)
@messageTypeName = message_type_name,
@messageBody = message_body
FROM [Login_Killer_Queue]
), TIMEOUT 500
-- se nao houver mensagens saia
IF @@ROWCOUNT = 0
BEGIN
BREAK ;
END ;
-- se o tipo da mensagem for um EventNotification para a fila atual
IF (@messageTypeName = 'http://schemas.microsoft.com/SQL/Notifications/EventNotification')
BEGIN
DECLARE @XML XML,
@host_name varchar(128) ,
@login_name varchar(128) ,
@SPID varchar(5);

SELECT @XML=CONVERT(XML,@messageBody)
,@host_name = ''
,@login_name = ''
,@SPID ='';

-- Pega o SPID e as informacoes de login
SELECT @SPID = @XML.value('(/EVENT_INSTANCE/SPID)[1]', 'varchar(5)')
, @host_name = @XML.value('(/EVENT_INSTANCE/HostName)[1]', 'NVARCHAR(128)')
, @login_name = @XML.value('(/EVENT_INSTANCE/LoginName)[1]', 'NVARCHAR(128)')
;

DECLARE @kill varchar(8000) = '';
--Caso o hostname e o login entrem no criterio abaixo
if ((@host_name like 'SPO%') and (@login_name like '%_user'))
SELECT @kill = @kill + 'kill ' + @SPID + ';'
EXEC(@kill);

--/* esta parte pode ser comentada para não gerar "log" do kill
if ((@host_name like 'SPO%') and (@login_name like '%_user'))
INSERT INTO [dbo].[DBA_FailedConnectionTracker]
([host_name], [login_name], FailedLoginData,spidu)
values ( @host_name, @login_name,@XML,@SPID);
--*/
END;
END;
END;
--inicia a matanca

ALTER QUEUE [dbo].[Login_Killer_Queue]
WITH STATUS = on
,ACTIVATION (PROCEDURE_NAME = [spc_DBA_FailedConnectionTracker]
,STATUS = ON
,MAX_QUEUE_READERS = 1
,EXECUTE AS OWNER)
GO

5 Motivos para ir ao SQL Saturday #100


  1. Os tópicos – basicamente dividido em três categorias: BI, DBA e DEV, será como estar em uma banca de pasteis,,, tem pra todo o gosto,,, tópicos interessante sendo apresentados por pessoas que conhecem do assunto,,,, falando do mundo real…
  2. Contatos – vamos aumentar o número de conhecidos no face? – também conhecido como networking,,, prepare uns cartões de visita, tenha uma conta no twitter e não tenha vergonha de falar com as pessoas (isso server mais pra mim, vcs não tem noção do quanto acho complicado lidar com unidades de carbono…)
  3. É barato,,, é de graça !!! Smiley de boca aberta 
  4. Mas e se meu chefe não liberar? Ah! É sábado não tem o que ele reclamar,,, Vai ser mais difícil você convencer dona patroa em deixar você ficar um sábado inteiro longe dela em um lugar com um monte de gente esquisita falando sobre SQL do que falar com o chefe…
  5. é o de número 100 e é no Brasil !!!!Vamos lá mostrar que vale a pena promover eventos aqui !!

Já escolhi o que vou assistir,,, espero ver vocês lá…

SQLPASS – Chegamos no esquema


11/10/11 – Fizemos o checkin do evento,,, como começo a ficar de costume, nos meus brindes veio faltando alguma coisa,,, no voo foi o fone de ouvido,,, daqui foi a cordinha para o crachá.

12/10/11 – Chegamos no evento,,, um monte de gente,,, já na escada rolante escuramos alguns brasileiros,,,

08h13 – muita gente no salão para o keynote,,, esse pessoal é muito estranho,,, só sabem falar inglês,,, q coisa chata,,, uahuahauhauha e nada de começar….

08h17 – começa com um video de pessoas falando sobre o significado do evento,,,

08h19 – apareceu o presidente do SQLPASS (Rushabh Mehta),,, ele está falando sobre a comunidade,,, mostrando quem faz parte do border,,, ele disse que o twitter está acima da capacidade,,, alguém precisa dizer pra ele que o wireless daqui não está aguentando a quantidade de gente,,,

08h27 – 189 seções, 204 palestrantes,,, e muita gente,,, no folheto dentro da mala mostra onde estão as salas interessantes,,, e qual o nível do treinamento,,,,

08h36 – basicamente uma explicação do evento,,, até que foi legal…

08h37 – Agora o Sr. vice presidente de produtos MS, Ted Kummert,,,

08h39 – The New World of Data, Ted Kummert está falando sobre que a menina dos olhos é Cloud,,, até aí,,, qual a novidade?,,

08h42 – 400k horas, 79k membros, 300 mvps,,, é coisa de gente grande,,,,

08h45 – Ted Kummert, está falando sobre os 3 pilares do SQL Server Denali.

08h50 – Agora o SQL Server Denali tem um nome oficial,,, SQL Server 2012 (esse pessoal é muito criativo,,,) e pelo que ele disse vai ser lançado no começo do ano que vem (isso vai ser uma grande novidade)

08h57 – Vamos ter outra versão do Azure até o final do ano,,, com novos tipos de dados….

09h07 – Denny Lee está demonstrando algumas novas consultas usando como exemplo o excel…

09h13 – Agora tem um pouco de SQL Azure labs…. vamos ver que zona vai sair disso,,,

09h18 – Mais exemplos com excel,,,, nós já sabemos que podemos extrair muitos dados, gerar relatórios e fazer uma festa com o excel acessando SQL,,, mas poxa, não viemos até aqui pra brincar com Excel,,, quero ver SQL,,,

09h26 – Agora pra que estudar para BI? qualquer criança que conheça um pouquinho de excel vai conseguir fazer qualquer coisa com acesso aos dados,,, até que não é ruim,,, o problema é que essa liberdade para o usuário, que na maior parte das vezes toma piau pra conseguir mandar um email, pode gerar mais dificuldades do que facilidades… O usuário tem que aprender a saber o que quer antes de ter a liberdade de acessar o que ele quer,,,, sem treinamento isso pode se tornar mais em problema do que liberdade,,,

09h37 – Amir Nets faz umas apresentações muito boas…. as apresentações de BI dele são muito boas…

09h55 bem no final da apresentação do Amir Netz, o tablet não consegue conectar na internet,,, e para tora a apresentação,,, uhauhauhaua, vir em uma apresentação com produtos MS e ela não ter problema? não tem graça,,,

09h57 – fim do keynote,,, agora vamos ver as outras coisas,,,