IP Adresse einer User Connection ermitteln

Definitiv etwas auf meiner persönlichen SQL Server Wish List. Es wäre schön, wenn man diese Information ähnlich wie HOST_NAME() abfragen könnte.

...

set nocount on
declare @ip varchar(255), @cmd varchar(100) 
set @cmd = 'ping -n 1 ' + HOST_NAME() 
create table #temptb (grabfield varchar(255)) 
insert into #temptb exec master.dbo.xp_cmdshell @cmd 
select @ip = substring(grabfield,  charindex('[',grabfield)+1,
 charindex(']',grabfield)-charindex('[',grabfield)-1) 
  from #temptb  where left(grabfield,7) = 'Pinging' 
print @ip 
drop table #temptb
set nocount off 

Das obige Beispiel funktioniert, wenn man die englischen Softwareversionen einsetzt. Setzt man hingegen die deutschsprachigen Versionen ein, muß man die obige WHERE Bedingung durch folgende ersetzen:

where left(grabfield,5) ='Ping '

Anmerkung 09.12.2004: Auf SQL Server Central hat mich AJ Ahrens auf den kleinen, aber netten Parameter Ping -n 1 hingewiesen. Dieser bewirkt, daß nur ein Ping abgesetzt wird, anstelle der üblichen 4.

Anmerkung 14.12.2004: SQL Server MVP Kenneth Wilhelmsson hat in dem oben erwähnten Thread folgenden Lösungsvorschlag gepostet:

create table #ipconfig
( conf varchar(100) null )

insert #ipconfig
exec master..xp_cmdshell 'ipconfig'

declare @ip varchar(15), @mask varchar(15)

select  @ip = right(conf, charindex(':', reverse(conf)) -1)
from  #ipconfig
where  patindex('%IP Address%', conf) > 0
 
select @mask = right(conf, charindex(':', reverse(conf)) -1)
from  #ipconfig
where patindex('%Subnet Mask%', conf)> 0

select  ltrim(@ip)  as ip,
 ltrim(@mask)  as mask

drop table #ipconfig
go


ip              mask            
--------------- --------------- 
130.XXX.XXX.XXX  255.XXX.0.0

(1 row(s) affected)

Wenn man die deutschen Versionen einsetzt, muß man folgende Änderungen vornehmen:

where  patindex('%IP-Adresse%', conf) > 0

und

where patindex('%Subnetzmaske%', conf)> 0

um das Skript zum Laufen zu bringen. Und, zu guter Letzt, hat Razvan Socol noch eine dritte interessante Lösung präsentiert.

CREATE TABLE #ErrLog (errorlog varchar(8000), ContinuationRow int)
INSERT INTO #ErrLog EXEC sp_readerrorlog
SELECT SUBSTRING(errorlog,
 CHARINDEX('SQL server listening on ',errorlog)+24,
 CHARINDEX(': ',errorlog)-CHARINDEX('SQL server listening on ',errorlog)-24)
  FROM #ErrLog 
 WHERE errorlog LIKE '%SQL server listening on %:%'
DROP TABLE #ErrLog
                 
---------------- 
130.XXX.XXX.XXX
127.0.0.1

(2 row(s) affected)

Hier lediglich noch zusätzlich der Hinweis, daß sp_readerrorlog undokumentiert ist. Setzt man deutsche Versionen eine, muß der Batch folgendermaßen formuliert werden:

CREATE TABLE #ErrLog (errorlog varchar(8000), ContinuationRow int)
INSERT INTO #ErrLog EXEC sp_readerrorlog
SELECT SUBSTRING(errorlog,
 CHARINDEX('SQL Server überwacht ',errorlog)+21,
 CHARINDEX(': ',errorlog)-CHARINDEX('SQL Server überwacht ',errorlog)-21)
  FROM #ErrLog
 WHERE errorlog LIKE '%SQL Server überwacht %:%'
DROP TABLE #ErrLog

Update 10.10.2007: Glücklicherweise ist im SQL Server 2005 alles anders :

SELECT client_net_address
  FROM sys.dm_exec_connections
 WHERE session_id=@@spid
Noch kein Feedback
Einen Kommentar hinterlassen

Ihre E-Mail-Adresse wird nicht auf dieser Seite angezeigt.
SchlechtExzellent
(Zeilenumbrüche werden zu <br />)
(For my next comment on this site)
(Allow users to contact me through a message form -- Your email will not be revealed!)
Dies ist ein Captcha Bild. Es wird benutzt, um Massenzugriffe von Robotern zu verhindern.
Bitte gib die Zeichen des obigen Bildes ein. (Groß/Kleinschreibung ist wichtig)
Trackback-Adresse für diesen Eintrag
Dies ist ein Captcha Bild. Es wird benutzt, um Massenzugriffe von Robotern zu verhindern.
Bitte gib die Zeichen des obigen Bildes ein. (Groß/Kleinschreibung ist wichtig)