2012-03-30 12 views
21

Mam wyzwalacz do wstawiania/aktualizacji/usuwania. To działa dobrze. Potrzebuję również adresu IP klienta, z którego dokonywane są zmiany. To, czego potrzebuję w T-SQL, to znaczy nie w żadnej formie internetowej, ale w SQL/T-SQL, podczas gdy mój trigger zostanie uruchomiony.Jak uzyskać adres IP klienta z samego SQL Server 2008?

Również chodziłem i dostałem, że jest procedura przechowywana w głównej bazie danych o nazwie xp_cmdshell, która po uruchomieniu z ipconfig możemy uzyskać adres IP. Myślę, że to zadziała tylko wtedy, gdy masz dostęp administracyjny do bazy danych. Mój hosting to dzielony hosting, więc nie mam takiego przywileju. Czy jest jakieś inne wyjście?

Proszę o pomoc

góry dziękuję

Uwaga: nie mam uprawnień administratora na moim SQL Server 2008 bazy danych. Potrzebuję rozwiązania jako uwierzytelniony użytkownik.

Kolejna zmiana:

Mam rozwiązanie, kwerendy, które będą pracować dla mojego scenariusza jest

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

Wykonuje jako potrzebne, ale jest tylko jeden problem, że net_address nie jest w formacie IP. Poniżej wynik kopalni:

hostname net_library  net_address 
IPC03  TCP/IP   AE8F925461DE 

Jestem chętny wiedzieć:

  1. Co jest net_address tutaj? Czy jest adres MAC lub adres IP itp.?

  2. Czy istnieje sposób konwersji adresu sieciowego na adres IP?

Humble prośba:

przed odebraniem/komentowania/downvoting, chciałbym poprosić, aby przejść na pytanie pierwsze, dokładnie. Zauważyłem, że kilku facetów komentowało/głosowało bez właściwego przejścia przez to pytanie. Żadnych problemów, wszyscy popełniają błędy. Ale nie za każdym razem się myli. :)

+1

Podajesz, że baza danych jest hostowana, ale jak działa ta aplikacja? W większości aplikacji ASP.NET użytkownicy łączą się ze stroną internetową i witryną, a następnie łączą się z bazą danych. Tak więc serwer bazy danych nie ma pojęcia, kto lub gdzie jest "prawdziwy" użytkownik końcowy. Jeśli możesz podać więcej szczegółów na temat aplikacji i sposobu łączenia się użytkowników z bazą danych, ktoś może mieć sugestię. – Pondlife

+0

Możesz znaleźć szczegółowe informacje na temat ** net_address ** z http://msdn.microsoft.com/en-us/library/ms179881.aspx –

Odpowiedz

31

znalazłem coś co może pracować dla Ciebie

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 

Od How to get Client IP Address in SQL Server

Mają również spojrzeć na ten artykuł o Get client IP address

+1

znalazłeś to samo, ale wygrałeś z 20 sekund :) –

+0

+1 za twoją szczerość na SO .... keep it on –

+2

Cześć, wydaje się, że zapytanie jest w porządku, ale dostałem komunikat o błędzie - Użytkownik nie ma uprawnień do wykonania tej akcji. Ten sam scenariusz przyszedł tutaj .. Nie mam uprawnień administratora –

20

można wypróbować this solution.Działa to nawet na wspólnej hosting:

select CONNECTIONPROPERTY('client_net_address') AS client_net_address 
+0

Dzięki ... późno, ale na pewno dam mu szansę ... –

+2

Link wskazuje, że możesz również użyć 'CONNECTIONPROPERTY ('local_net_address') AS local_net_address' jako wiele innych zmiennych CONNECTIONPROPERTY. – Trisped

+2

To jest lepsze rozwiązanie, ponieważ nie potrzebuje uprawnień do odczytu sys.dm_exec_connections –

5

Ostatecznie dołączyć tabele dwa systemowe:

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 

wyjściowa:

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

potrzebuje tylko jednej linii kodu

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

Nie udało mi się uzyskać dokładnej liczby I P adres, zamiast tego mam wartość NULL z powodu ograniczenia powyższych instrukcji. Ograniczeniem jest to, że otrzymujesz tylko adresy IP, jeśli jesteś podłączony przez TCP/IP. Jeśli jesteś lokalny i używasz pamięci wspólnej, to te atrybuty nie istnieją. Jeśli wyłączysz pamięć współużytkowaną (lub dowolne protokoły z wyjątkiem TCP/IP) za pomocą Menedżera konfiguracji serwera, zawsze otrzymasz adres IP dla dowolnego połączenia.

Jesteś najlepszy skazani

SELECT SERVERPROPERTY(N'MachineName'); 

... który może działać w miejscu numerycznego adresu IP.