2012-03-30 763 views
21

Tengo un disparador para insertar/actualizar/eliminar. Eso está funcionando bien. Además, necesito la dirección IP del cliente desde donde se realizan los cambios. Eso es lo que necesito en T-SQL, es decir, no en ninguna forma web, sino en SQL/T-SQL mientras mi desencadenante será disparado.¿Cómo obtener la dirección IP del cliente de SQL Server 2008?

También me di cuenta de que hay un procedimiento almacenado en la base de datos maestra llamada xp_cmdshell que cuando se ejecuta con ipconfig podemos obtener la dirección IP. Creo que esto funcionará solo cuando tengas acceso administrativo a la base de datos. Mine hosting es un alojamiento compartido, por lo que no tengo ese privilegio. ¿Hay alguna otra salida?

Por favor, ayuda

Gracias de antemano

Tenga en cuenta: no tengo privilegios administrativos en mi base de datos de SQL Server 2008. Necesito una solución como usuario autenticado.

Otra actualización:

tengo la solución, la consulta que va a trabajar para mi escenario es

SELECT hostname, net_library, net_address 
FROM sys.sysprocesses 
WHERE spid = @@SPID 

Se ejecuta como sea necesario, pero sólo hay un problema, que NET_ADDRESS no es en formato IP. A continuación se muestra resultado mía:

hostname net_library  net_address 
IPC03  TCP/IP   AE8F925461DE 

Estoy ansioso por saber:

  1. ¿Cuál es NET_ADDRESS aquí? ¿Es la dirección MAC o alguna dirección IP, etc.?

  2. ¿Hay alguna forma de convertir net_address a ip?

humilde petición:

Antes de responder/comentarios/downvoting, yo pediría que se vaya a través de la pregunta, en primer lugar, a fondo. Encontré a algunos muchachos comentados/downvoted sin pasar la pregunta correctamente. Sin problemas, todos cometemos errores. Pero no todas las veces cometer un error. :)

+1

Menciona que su base de datos está alojada, pero ¿cómo funciona la aplicación? En la mayoría de las aplicaciones ASP.NET, los usuarios se conectan a un sitio web y luego el sitio web se conecta a la base de datos. Entonces, el servidor de la base de datos no tiene idea de quién o dónde está el usuario final "real". Si puede dar más detalles sobre su aplicación y cómo los usuarios se conectan a la base de datos, alguien puede tener una sugerencia. – Pondlife

+0

Puede encontrar los detalles sobre ** net_address ** de http://msdn.microsoft.com/en-us/library/ms179881.aspx –

Respuesta

31

he encontrado algo que podría funcionar para usted

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 

De How to get Client IP Address in SQL Server

también echar un vistazo a este artículo sobre Get client IP address

+1

encontró lo mismo pero ganó con 20 segundos :) –

+0

+1 para su sinceridad en SO ... mantenlo en –

+2

Hola, parece que la consulta está bien pero recibí un mensaje de error: el usuario no tiene permiso para realizar esta acción. El mismo escenario llegó aquí .. No tengo privilegios de administrador –

20

Usted puede probar this solution.Incluso funciona en el alojamiento compartido:

select CONNECTIONPROPERTY('client_net_address') AS client_net_address 
+0

Gracias ... es tarde, pero definitivamente voy a probar ... –

+2

Link indica que puede usar 'CONNECTIONPROPERTY ('local_net_address') AS local_net_address' también como una serie de otras variables CONNECTIONPROPERTY. – Trisped

+2

Esta es una solución mejor ya que no necesita el permiso para leer sys.dm_exec_connections –

5

unen última instancia las tablas de dos sistemas:

SELECT hostname, 
     net_library, 
     net_address, 
     client_net_address 
FROM sys.sysprocesses AS S 
INNER JOIN sys.dm_exec_connections AS decc ON S.spid = decc.session_id 
WHERE spid = @@SPID 

Salida:

hostname | net_library | net_address | client_net_address  
PIERRE | TCP/IP  | 0090F5E5DEFF| 10.38.168.5 
4

que necesita simplemente sola línea de código

SELECT CONVERT(char(15), CONNECTIONPROPERTY('client_net_address')) 
0

No pude obtener el número exacto I P dirección, en su lugar obtuve un valor NULL debido a la limitación de las declaraciones anteriores. El límite es que solo obtiene direcciones IP si está conectado a través de TCP/IP. Si eres local y usas la memoria compartida, esos atributos no existen. Si desactiva la Memoria compartida (o cualquier protocolo a excepción de TCP/IP) a través del Administrador de configuración del servidor, siempre obtendrá la dirección IP para cualquier conexión.

Usted es el mejor pegado con

SELECT SERVERPROPERTY(N'MachineName'); 

... que puede actuar en lugar de la dirección IP numérica.

Cuestiones relacionadas