Array
(
)

Como DESCOBRIR conexões

Li
   - 31 ago 2004

Olá, Pessoal

Estou precisando verificar de alguma maneira quem por algum motivo pode estar acessando um Banco de Dados - SQL 2000, via MS-Access, ou seja vinculando as tabelas via ODBC. Tentei verificar no Entreprise Manager \ Management\SQL server Logs, porém infofmações contidas ali´são dos backup´s realizados , recovery, rollback, etc. Tentei veriicar pelo Process Info, que dá para verificar onde são informados a aplicação, o usuario, etc.
1 - Existe alguma maneira de gravar este log ?
2 - Existe uma maneira de verificar em tempo real os log´s, pois quando quero visualizar o log mais atual, é preciso fechar e abrir o enterprise manager, existe uma maneira de visualizar sem ter que fechar o Enterprise manager ? ou outra maneira de poder monitorar ?

Agradeço desde já.

Marcus.magalhaes
   - 31 ago 2004

Oi Ligia.

Vc pode fazer um select na tabela master..sysprocesses, esta tabela contém as conexões, usuários, program name, etc.

Ex.:

Select spid, loginame, hostname, program_name, cmd
From master..sysprocesses (NoLock)
Este comando irá retornar o ID da conexão, login name, a máquina, o nome da aplicação e o comando executado.

Para salvar isso num log, vc pode fazer uma proc que é executada pelo SQL Agent, com parametros de intervalo de execução e por quanto tempo ela será executada.
Utilize para isso o comando WAITFOR Delay ´hh:mm:ss´.

Espero ter ajudado.

Att,

Li
   - 03 set 2004

Olá, Marcus !

Vou tentar ! Depois te conto o que aconteceu.

Obrigada,

:D

Li
   - 21 set 2004

Oi, Vi (my teacher!!!)

Fiz o select e tentei várias e várias conexões de diversas máquinas e maneiras, realmente mostra corretamente as informações inclusive a ferramenta que se está utilizando para o acesso.
Só não entendi como fazer para gravar o log, pois quando a conexão é encerrada as informações consequentemente tbm é encerrada.

Bjs,

Marcus.magalhaes
   - 21 set 2004

Oi Lili, acho q assim ficara mais claro

-- Cria as tabelas que irão armazenar os dados das conexoes
Drop Table Teste
GO
Drop Table CaptCMD
GO
Create Table Teste (spid Int, loginame VarChar(30), hostname VarChar(40), programname VarChar(30), cmd VarChar(255))
GO
Create Table CaptCMD(eventtype nVarChar(30), Parameters Int, EventInfo nVarChar(255))

-- Cria a proc de monitoracao
Drop Procedure dbo.sp_MONITORA_CONEXAO
GO
Create Procedure dbo.sp_MONITORA_CONEXAO
(
@var_intervaloChar( 08 ), --coloquei ´( 08 )´ assim senão ele posta uma carinha.
@var_qtdeminInt
)
As
Begin
Declare @temp_table Table (spid Int, loginame VarChar(30), hostname VarChar(40), programname VarChar(30))

Declare @var_horafinalDateTime,
@var_comandoVarChar(255),
@var_eventinfoVarChar(255),
@var_spidInt

Set @var_horafinal = DateAdd(mi, 3, GetDate())

While (GetDate() < @var_horafinal)
Begin
Insert Into @temp_table(spid, loginame, hostname, programname)
Select spid, loginame, hostname, program_name
From master..sysprocesses (NoLock)
Where loginame ´sa´ -- não captura conexões do SA a menos q se queira
And spid @@spid

Declare cur_CONEXAO Cursor For Select spid From @temp_table
Open cur_CONEXAO

Fetch Next From cur_CONEXAO Into @var_spid
While(@@Fetch_Status = 0)
Begin
Set @var_comando = ´DBCC Inputbuffer(´ + Convert(VarChar, @var_spid) + ´)´

Insert Into CaptCMD(eventtype, Parameters, EventInfo)
Exec (@var_comando)

Insert Into Teste (spid, loginame, hostname, programname)
Select spid, loginame, hostname, programname
From @temp_table
Where spid = @var_spid

Select @var_eventinfo = eventinfo
From captcmd

Update teste
Set cmd = @var_eventinfo
Where spid = @var_spid

Delete
From CaptCMD

Fetch Next From cur_CONEXAO Into @var_spid
End
Close cur_CONEXAO
Deallocate cur_CONEXAO

Waitfor Delay @var_intervalo
End
End
GO

-- Chamada da proc, ela ira fazer a verificação de 10 em 10 segundo, durante 3 minutos.
Exec dbo.sp_MONITORA_CONEXAO ´00:00:10´, 3

-- Verifica a tabela de log
Select *
From teste
E para rodar a proc, vc pode criar um job q inicia numa determinada hora e dura x minutos.

Bjs..Vi.