Digamos que encontrei um SQL Server e não tenho idéia de quais aplicativos se conectam a ele. Talvez eu encontre um aplicativo, mas não tenho certeza se é o único a usá-lo.
Existe uma boa maneira de encontrar todas as conexões distintas?
fonte
Digamos que encontrei um SQL Server e não tenho idéia de quais aplicativos se conectam a ele. Talvez eu encontre um aplicativo, mas não tenho certeza se é o único a usá-lo.
Existe uma boa maneira de encontrar todas as conexões distintas?
Você pode ver os processos atualmente em execução no SSMS no Activity Monitor.
Você também pode obtê-lo usando sys.dm_exec_sessions , bem como sys.dm_exec_connections e sys.dm_exec_requests .
Inquerir:
SELECT DB_NAME(database_id) as [DB]
, login_name
, nt_domain
, nt_user_name
, status
, host_name
, program_name
, COUNT(*) AS [Connections]
FROM sys.dm_exec_sessions
WHERE database_id > 0 -- OR 4 for user DBs
GROUP BY database_id, login_name, status, host_name, program_name, nt_domain, nt_user_name;
Nome do host, nome do processo ou nomes de usuário do domínio geralmente fornecem mais informações do que apenas um endereço IP. Outras colunas podem ser adicionados, tais como: login_time
,last_successful_logon
IP e outras informações podem ser recuperadas com um JOIN para sys.dm_exec_connections on session_id
: client_net_address
, local_net_address
, connect_time
, portos, ...
sys.dm_exec_requests também pode fornecer informações úteis: command
type ,,sql_handle
...
Esta consulta é apenas uma amostra. Você deve JOIN
juntar essas três visualizações e gerar / armazenar informações relevantes de qualquer uma delas.
Os dados desses modos de exibição desaparecem quando o SQL Server é reiniciado. Portanto, se o aplicativo não estiver conectado regularmente, pode ser uma boa ideia armazená-los regularmente usando um trabalho ou um script (Powershell).
Eu também sugeriria o que Julien sugeriu, mas acho que agendar a consulta pelo SQL Server Agent seria uma ideia melhor e, toda vez que for executada, você despeja as informações em uma tabela física. Duas DMVs são unidas sys.dm_exec_connections
esys.dm_exec_sessions
Como primeiro criar uma tabela física
create table Session_Information
( session_id int,
net_transport nvarchar(40),
host_name nvarchar(128),
program_name nvarchar(128),
nt_user_name nvarchar(128),
connect_time datetime,
client_interface_name nvarchar(128),
client_net_address varchar(48),
local_net_address varchar(48),
login_name nvarchar(128),
nt_domain nvarchar(128),
login_time datetime
);
Em seguida, insira registros nesta tabela:
Insert into Session_Information
SELECT
c.session_id,
c.net_transport,
s.host_name,
s.program_name,
s.nt_user_name,
c.connect_time,
s.client_interface_name,
c.client_net_address,
c.local_net_address,
s.login_name,
s.nt_domain,
s.login_time
FROM sys.dm_exec_connections AS c
JOIN sys.dm_exec_sessions AS s
ON c.session_id = s.session_id;
Programe isso para ser executado via SQL Server Agent a cada 15 minutos ou mais e, no final do dia, você poderá ver tudo o que quiser da tabela session_information
.
Habilite a auditoria de logon do SQL Server para logons com êxito e com falha: https://docs.microsoft.com/en-us/sql/ssms/configure-login-auditing-sql-server-management-studio
Alterar o escopo da auditoria exigiria uma reinicialização do serviço SQL. Depois que o serviço for reiniciado, todos os logons bem-sucedidos (usuário) e seu endereço IP começarão a ser registrados nos logs do SQL Server. Esses dados podem ser coletados por cerca de uma semana ou 2 e, em seguida, o arquivo de log é analisado para listar todos os endereços IP (e usuário) que acessaram os bancos de dados do SQL Server durante o período monitorado.
Se o componente SSRS também estiver instalado na mesma caixa, a tabela ExecutionLog do banco de dados ReportServer poderá ser analisada para listar todos os logons que acessam o portal SSRS.
De Obter endereço IP do cliente no SQL Server por Sarvesh Kumar Gupta :
CREATE FUNCTION [dbo].[GetCurrentIP] () RETURNS varchar(255) AS BEGIN DECLARE @IP_Address varchar(255); SELECT @IP_Address = client_net_address FROM sys.dm_exec_connections WHERE Session_id = @@SPID; Return @IP_Address; END