2012-03-30 3 views
21

У меня есть триггер для вставки/обновления/удаления. Это прекрасно работает. Кроме того, мне нужен IP-адрес клиента, с которого сделаны изменения. То, что мне нужно в T-SQL, то есть не в любой веб-форме, а в SQL/T-SQL, пока мой триггер будет запущен.Как получить IP-адрес клиента от самого SQL Server 2008?

Также я ушел, и получил, что там хранится процедура в основной базе данных с именем xp_cmdshell, которая при выполнении с ipconfig мы можем получить IP-адрес. Я думаю, что это будет работать только тогда, когда у вас есть административный доступ к базе данных. Мой хостинг - это общий хостинг, поэтому у меня нет такой привилегии. Есть ли другой выход?

Пожалуйста, помогите

Спасибо заранее

Обратите внимание: Я не имею права администратора на моем SQL Server базы данных 2008. Мне нужно решение как аутентифицированный пользователь.

Еще одно обновление:

Я получил решение, запрос, который будет работать для моего сценария

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

Он выполняет по мере необходимости, но есть только один вопрос, что net_address не в формате IP. ниже мой результат:

hostname net_library  net_address 
IPC03  TCP/IP   AE8F925461DE 

Я стремлюсь узнать:

  1. Что net_address здесь? Является ли MAC-адрес или какой-то IP-адрес и т. Д.?

  2. Есть ли способ конвертировать net_address в ip?

Humble запрос:

Прежде чем ответить/комментирование/downvoting, я хотел бы просить вас, чтобы пройти через этот вопрос, во-первых, тщательно. Я обнаружил, что некоторые ребята комментировали/сокращали без должного рассмотрения вопроса. Нет проблем, все делают ошибки. Но не каждый раз ошибаться. :)

+1

Вы упомянули, что ваша база данных размещена, но как работает приложение? В большинстве приложений ASP.NET пользователи подключаются к веб-сайту, а затем веб-сайт подключается к базе данных. Таким образом, сервер базы данных не знает, кто или где «реальный» конечный пользователь. Если вы можете дать более подробную информацию о своем приложении и как пользователи подключаются к базе данных, у кого-то может быть предложение. – Pondlife

+0

Вы можете найти информацию о ** net_address ** с http://msdn.microsoft.com/en-us/library/ms179881.aspx –

ответ

31

я нашел то, что могло бы работать для вас

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 

От How to get Client IP Address in SQL Server

Кроме того, посмотрите на эту статью о Get client IP address

+1

найдено то же самое, но вы выиграли с 20 секундами :) –

+0

+1 за вашу искренность на SO .... держать его на –

+2

Привет, кажется, вопрос в порядке, но я получил сообщение об ошибке - у пользователя нет разрешения на выполнение этого действия. Тот же сценарий пришел сюда. У меня нет прав администратора. –

20

Вы можете попробовать this solution.Она работает даже на общем хостинге:

select CONNECTIONPROPERTY('client_net_address') AS client_net_address 
+0

Спасибо ... его поздно, но я обязательно дам ему шанс ... –

+2

Ссылка указывает, что вы можете использовать 'CONNECTIONPROPERTY ('local_net_address') AS local_net_address', а также как ряд других переменных CONNECTIONPROPERTY. – Trisped

+2

Это лучшее решение, поскольку ему не требуется разрешение на чтение sys.dm_exec_connections –

5

В конечном итоге присоединиться две системные таблицы:

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 

Выход:

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

это нужно только одну строку кода

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

Я не мог получить точный номер I P, вместо этого я получил значение NULL из-за ограничения вышеуказанных утверждений. Предел в том, что вы получаете IP-адреса только при подключении через TCP/IP. Если вы локальны и используете общую память, эти атрибуты не существуют. Если вы отключите общую память (или любые протоколы, за исключением TCP/IP) через Server Configuration Manager, вы всегда будете получать IP-адрес для любого соединения.

Вы лучше застряли с

SELECT SERVERPROPERTY(N'MachineName'); 

... который может действовать вместо числового IP-адреса.

Смежные вопросы