SQL: query per ottenere l'indirizzo IP del server


95

C'è una query in SQL Server 2005 che posso utilizzare per ottenere l'IP o il nome del server?


Quando ci si connette a SQL utilizzando un listener AG, sembra che CONNECTIONPROPERTY ('local_net_address') restituisca l'IP del listener invece dell'IP del server.
brian beuning il

Risposte:


147
SELECT  
   CONNECTIONPROPERTY('net_transport') AS net_transport,
   CONNECTIONPROPERTY('protocol_type') AS protocol_type,
   CONNECTIONPROPERTY('auth_scheme') AS auth_scheme,
   CONNECTIONPROPERTY('local_net_address') AS local_net_address,
   CONNECTIONPROPERTY('local_tcp_port') AS local_tcp_port,
   CONNECTIONPROPERTY('client_net_address') AS client_net_address 

Il codice qui ti darà l'indirizzo IP;

Funzionerà per una richiesta del client remoto a SQL 2008 e versioni successive.

Se sono consentite le connessioni di memoria condivisa, allora in esecuzione sopra sul server stesso ti darà

  • "Shared Memory" come valore per 'net_transport' e
  • NULL per "local_net_address" e
  • " <local machine>" verrà visualizzato in "client_net_address".

'client_net_address' è l'indirizzo del computer da cui ha avuto origine la richiesta, mentre 'local_net_address' sarebbe il server SQL (quindi NULL sulle connessioni di memoria condivisa) e l'indirizzo che daresti a qualcuno se non può usare NetBios del server nome o FQDN per qualche motivo.

Consiglio vivamente di non usare questa risposta . Abilitare la shell è una pessima idea su uno SQL Server di produzione.


3
Buona risposta tranne che ottengo un numero di porta negativo (-15736) per una porta che dovrebbe essere 49800. Quindi, se negativo, è sicuro aggiungere solo 65536?
crokusek

Se qualcuno vuole accedere da remoto al server SQL del mio computer, quale IP gli devo fornire? local_net_address o client_net_address?
david blaine

@rene - lo stava prendendo in considerazione, ma la risposta originale stessa è corretta (per SQL2008 + e connessioni remote), quindi ho pensato solo di chiarire cosa significassero i parametri ConnectionProperty. Ovviamente anche la risposta di Chris Leonard (dm_exec_connections) è corretta, per le stesse ragioni. Se pensi che il mio addendum sia meglio come risposta separata che sentirti libero di farlo :) Non ho risposto alle domande per un po ', quindi la politica e le regole qui potrebbero essere cambiate (le leggerò ora ...)
Martin S. Stoller

Motivo per addenum come da " stackoverflow.com/help/editing ": Per chiarire il significato del post (senza cambiare quel significato).
Martin S. Stoller

1
@ MartinS.Stoller Ho modificato la tua aggiunta per leggibilità. Per favore controlla se non mi sono perso nulla.
rene

33

Puoi ottenere [hostname] \ [instancename] tramite:

SELECT @@SERVERNAME;

Per ottenere solo il nome host quando hai il formato nome host \ nome istanza:

SELECT LEFT(ltrim(rtrim(@@ServerName)), Charindex('\', ltrim(rtrim(@@ServerName))) -1)

In alternativa, come ha sottolineato @GilM:

SELECT SERVERPROPERTY('MachineName')

Puoi ottenere l'indirizzo IP effettivo usando questo:

create Procedure sp_get_ip_address (@ip varchar(40) out)
as
begin
Declare @ipLine varchar(200)
Declare @pos int
set nocount on
          set @ip = NULL
          Create table #temp (ipLine varchar(200))
          Insert #temp exec master..xp_cmdshell 'ipconfig'
          select @ipLine = ipLine
          from #temp
          where upper (ipLine) like '%IP ADDRESS%'
          if (isnull (@ipLine,'***') != '***')
          begin 
                set @pos = CharIndex (':',@ipLine,1);
                set @ip = rtrim(ltrim(substring (@ipLine , 
               @pos + 1 ,
                len (@ipLine) - @pos)))
           end 
drop table #temp
set nocount off
end 
go

declare @ip varchar(40)
exec sp_get_ip_address @ip out
print @ip

Fonte dello script SQL .


19

Il server potrebbe avere più indirizzi IP su cui è in ascolto. Se la connessione dispone dell'autorizzazione del server VIEW SERVER STATE concessa, è possibile eseguire questa query per ottenere l'indirizzo a cui si è connessi a SQL Server:

SELECT dec.local_net_address
FROM sys.dm_exec_connections AS dec
WHERE dec.session_id = @@SPID;

Questa soluzione non richiede di sborsare nel sistema operativo tramite xp_cmdshell, che è una tecnica che dovrebbe essere disabilitata (o almeno strettamente protetta) su un server di produzione. Potrebbe essere necessario concedere VIEW SERVER STATE all'accesso appropriato, ma questo è un rischio per la sicurezza molto inferiore rispetto all'esecuzione di xp_cmdshell.

La tecnica citata da GilM per il nome del server è quella preferita:

SELECT SERVERPROPERTY(N'MachineName');

Grazie per questa risposta ... Credo che questo sia il vero modo per determinare l'indirizzo IP del server se è necessario verificarlo dal lato della connessione del client, specialmente se la connessione del client è stata stabilita con una stringa di connessione che conteneva un alias SQL o denominata istanza come origine dati.
Rodolfo G.

11

La maggior parte delle soluzioni per ottenere l'indirizzo IP tramite t-sql rientrano in questi due campi:

  1. Esegui ipconfig.exetramite xp_cmdshelle analizza l'output

  2. Query DMV sys.dm_exec_connections

Non sono un fan dell'opzione n. 1. L'abilitazione di xp_cmdshell presenta degli svantaggi di sicurezza e comunque sono coinvolte molte analisi. È ingombrante. L'opzione n. 2 è elegante. Ed è una pura soluzione t-sql, che preferisco quasi sempre. Di seguito sono riportate due query di esempio per l'opzione n. 2:

SELECT c.local_net_address
FROM sys.dm_exec_connections AS c
WHERE c.session_id = @@SPID;

SELECT TOP(1) c.local_net_address
FROM sys.dm_exec_connections AS c
WHERE c.local_net_address IS NOT NULL;

A volte, però, nessuna delle query precedenti funziona. La query n. 1 restituisce NULL se sei connesso tramite Shared Memory (connesso ed eseguendo SSMS sull'host SQL). La query n. 2 potrebbe non restituire nulla se non ci sono connessioni che utilizzano un protocollo di memoria non condivisa. Questo scenario è probabile quando ci si connette a un'istanza SQL appena installata. La soluzione? Forza una connessione su TCP / IP. A tale scopo, creare una nuova connessione in SSMS e utilizzare il prefisso "tcp:" con il nome del server. Quindi riesegui una delle query e otterrai l'indirizzo IP.

SSMS: connessione al motore di database


Questo darà ipv4 .. possiamo ottenere ipv6?
Shikhil Bhalla



7

- Prova questo script che funziona secondo le mie esigenze. Riformatta per leggerlo.

SELECT  
SERVERPROPERTY('ComputerNamePhysicalNetBios')  as 'Is_Current_Owner'
    ,SERVERPROPERTY('MachineName')  as 'MachineName'
    ,case when @@ServiceName = 
    Right (@@Servername,len(@@ServiceName)) then @@Servername 
      else @@servername +' \ ' + @@Servicename
      end as '@@Servername \ Servicename',  
    CONNECTIONPROPERTY('net_transport') AS net_transport,
    CONNECTIONPROPERTY('local_tcp_port') AS local_tcp_port,
    dec.local_tcp_port,
    CONNECTIONPROPERTY('local_net_address') AS local_net_address,
    dec.local_net_address as 'dec.local_net_address'
    FROM sys.dm_exec_connections AS dec
    WHERE dec.session_id = @@SPID;

Grazie. Dovevo solo aggiornare dec.local_tcp_port come "dec.local_tcp_port" per usarlo in una funzione. Altrimenti si lamenta che ci sono due colonne chiamate local_tcp_port.
Steven Van Dorpe


2

Un modo più semplice per ottenere il nome della macchina senza \ InstanceName è:

SELECT SERVERPROPERTY('MachineName')

1

So che questo è un vecchio post, ma forse questa soluzione può essere utile quando vuoi recuperare l'indirizzo IP e la porta TCP da una connessione di memoria condivisa (ad esempio da uno script eseguito in SSMS localmente sul server). La chiave è aprire una connessione secondaria a SQL Server utilizzando OPENROWSET, in cui specificare "tcp:" nella stringa di connessione. Il resto del codice sta semplicemente costruendo SQL dinamico per aggirare il limite di OPENROWSET di non essere in grado di prendere variabili come parametri.

DECLARE @ip_address       varchar(15)
DECLARE @tcp_port         int 
DECLARE @connectionstring nvarchar(max) 
DECLARE @parm_definition  nvarchar(max)
DECLARE @command          nvarchar(max)

SET @connectionstring = N'Server=tcp:' + @@SERVERNAME + ';Trusted_Connection=yes;'
SET @parm_definition  = N'@ip_address_OUT varchar(15) OUTPUT
                        , @tcp_port_OUT   int         OUTPUT';

SET @command          = N'SELECT  @ip_address_OUT = a.local_net_address,
                                  @tcp_port_OUT   = a.local_tcp_port
                          FROM OPENROWSET(''SQLNCLI''
                                 , ''' + @connectionstring + '''
                                 , ''SELECT local_net_address
                                          , local_tcp_port
                                     FROM sys.dm_exec_connections
                                     WHERE session_id = @@spid
                                   '') as a'

EXEC SP_executeSQL @command
                 , @parm_definition
                 , @ip_address_OUT = @ip_address OUTPUT
                 , @tcp_port_OUT   = @tcp_port OUTPUT;


SELECT @ip_address, @tcp_port

Notando solo che questo richiede Ad Hoc Distributed Queriesdi essere attivato.
Dan il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.