Usuário com melhor resposta
Retorna o IP do cliente

Pergunta
-
Galera preciso pega o ip do cliente,
gostaria de saber se tem como fazer da mesma forma que se faz pra pega o nome da maquina que seria:
SELECT host_name() AS maquina_cliente
Mas preciso do IP
Alguém sabe como q faz?
Antecipo agradecimentos.
- Movido Gustavo Maia Aguiar segunda-feira, 3 de outubro de 2011 02:01 (De:SQL Server - Desenvolvimento Geral)
Respostas
-
No caso você teria de criar a trigger para capturar a informação do IP do cliente.
Quando um novo cliente conectar no servidor, a trigger vai ser ativada e com isso o comando que retornou NULL vai retornar o IP do cliente e salvar o mesmo em uma tabela.
Não sei lhe dizer outra maneira de capturar o IP sem usar a DDL trigger.
Hoje na minha empresa fazemos uso da trigger para auditar quando necessário os logins no servidor. Usando uma estrutura parecida com o do exemplo do link que adicionei no primeiro post, coletamos várias informações sobre os logins e quando um login vem de um IP sendo do servidores de desenvolvimento por exemplo, a trigger bloqueia. Todas as informações são salvas em uma tabela para futura consultas.
No seu caso, acho que apenas o código abaixo resolveria
--CRIA O BANCO AUXILIAR CREATE DATABASE DBMONITOR GO --CRIA A TABELA PARA SALVAR O IP USE DBMONITOR CREATE TABLE tblClientIP(IPAdress nvarchar(15)) GO --CRIA A TRIGGER PARA LOGAR AS INFORMACOES CREATE TRIGGER save_ipaddress ON ALL SERVER FOR LOGON AS BEGIN DECLARE @capturedip NVARCHAR(15); SET @capturedip = (SELECT EVENTDATA().value('(/EVENT_INSTANCE/ClientHost)[1]', 'NVARCHAR(15)')); INSERT INTO DBMONITOR.dbo.tblClientIP VALUES(@capturedip) END GO
Geralmente nos servidores de produção eu adiciono um banco de dados especifico para esse tipo de tarefa. No meu caso , a tabela tblClienteIP fica em um banco chamado DBMonitor.
Depois para saber o IP que acessou o banco apenas realize uma consulta na tabela
Espero que ajude.
Lembre-se, antes de usar esse código em um servidor de produção execute alguns testes. Se algo ocorrer errado no comando, o servidor vai bloquear os logins. Fiz aqui o código e errei o nome da tabela por isso editei o post várias vezes. =)
Mas como mencionei, os servidores de produção da empresa usam uma trigger parecida com essa.
Abraço
Ronaldo Conde
- Editado Ronaldo R Conde quinta-feira, 29 de setembro de 2011 02:46
- Marcado como Resposta Lennon Pereira (MCTS) quinta-feira, 29 de setembro de 2011 12:17
Todas as Respostas
-
Boa noite Lennon
Você pode criar um DDL Trigger que pode capturar o IP do cliente e ainda se você quiser, bloquear acessos de determinados clientes via IP.
No link abaixo explica como criar passo a passo.
http://sql-articles.com/articles/security/ip-address-blocking-or-restriction-in-sql-server/
Usando o valor de retorno do EventData ->
SELECT
EVENTDATA().value(
'(/EVENT_INSTANCE/ClientHost)[1]'
,
'NVARCHAR(15)'
))
Nesse caso a Trigger é a nivel de servidor e não de tabela.
Abraço
Ronaldo Conde
- Sugerido como Resposta Ronaldo R Conde quinta-feira, 29 de setembro de 2011 01:35
- Não Sugerido como Resposta Ronaldo R Conde quinta-feira, 29 de setembro de 2011 01:35
-
-
No caso você teria de criar a trigger para capturar a informação do IP do cliente.
Quando um novo cliente conectar no servidor, a trigger vai ser ativada e com isso o comando que retornou NULL vai retornar o IP do cliente e salvar o mesmo em uma tabela.
Não sei lhe dizer outra maneira de capturar o IP sem usar a DDL trigger.
Hoje na minha empresa fazemos uso da trigger para auditar quando necessário os logins no servidor. Usando uma estrutura parecida com o do exemplo do link que adicionei no primeiro post, coletamos várias informações sobre os logins e quando um login vem de um IP sendo do servidores de desenvolvimento por exemplo, a trigger bloqueia. Todas as informações são salvas em uma tabela para futura consultas.
No seu caso, acho que apenas o código abaixo resolveria
--CRIA O BANCO AUXILIAR CREATE DATABASE DBMONITOR GO --CRIA A TABELA PARA SALVAR O IP USE DBMONITOR CREATE TABLE tblClientIP(IPAdress nvarchar(15)) GO --CRIA A TRIGGER PARA LOGAR AS INFORMACOES CREATE TRIGGER save_ipaddress ON ALL SERVER FOR LOGON AS BEGIN DECLARE @capturedip NVARCHAR(15); SET @capturedip = (SELECT EVENTDATA().value('(/EVENT_INSTANCE/ClientHost)[1]', 'NVARCHAR(15)')); INSERT INTO DBMONITOR.dbo.tblClientIP VALUES(@capturedip) END GO
Geralmente nos servidores de produção eu adiciono um banco de dados especifico para esse tipo de tarefa. No meu caso , a tabela tblClienteIP fica em um banco chamado DBMonitor.
Depois para saber o IP que acessou o banco apenas realize uma consulta na tabela
Espero que ajude.
Lembre-se, antes de usar esse código em um servidor de produção execute alguns testes. Se algo ocorrer errado no comando, o servidor vai bloquear os logins. Fiz aqui o código e errei o nome da tabela por isso editei o post várias vezes. =)
Mas como mencionei, os servidores de produção da empresa usam uma trigger parecida com essa.
Abraço
Ronaldo Conde
- Editado Ronaldo R Conde quinta-feira, 29 de setembro de 2011 02:46
- Marcado como Resposta Lennon Pereira (MCTS) quinta-feira, 29 de setembro de 2011 12:17
-
-
Lenon,
Veja este exemplo, utilizando a XP_CMDShell:
Create Procedure P_RetornarIP @IP VarChar(25) Output As Begin Set NoCount On Declare @Auditoria2 Table (Codigo Int Identity(1,1), IP VarChar(2000)) Set RowCount 8 Insert Into @Auditoria2 exec master.dbo.xp_cmdshell 'ipconfig' Select @IP=(Select Replace(Substring(IP,CharIndex(':',IP,1),25),':','') from @Auditoria2 Where Codigo = 8) End Create Table Auditoria (Codigo Int Identity(1,1), HostName VarChar(20) Null) Declare @IP VarChar(25) Exec P_RetornarIP @IP OutPut Insert Into Auditoria Values (@IP) Select * from Auditoria
Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]