SQL-서버의 IP 주소를 얻기위한 쿼리


95

SQL Server 2005에 서버의 IP 또는 이름을 가져 오는 데 사용할 수있는 쿼리가 있습니까?


AG 리스너를 사용하여 SQL에 연결하면 CONNECTIONPROPERTY ( 'local_net_address')가 서버 IP 대신 리스너 IP를 반환합니다.
brian beuning

답변:


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 

여기에있는 코드는 IP 주소를 제공합니다.

이것은 SQL 2008 이상에 대한 원격 클라이언트 요청에 대해 작동합니다.

공유 메모리 연결이 허용 된 경우 서버 자체에서 위를 실행하면

  • 'net_transport'값으로 "공유 메모리"
  • 'local_net_address'의 경우 NULL 및
  • ' <local machine>'은 'client_net_address'에 표시됩니다.

'client_net_address'는 요청이 시작된 컴퓨터의 주소이고 'local_net_address'는 SQL 서버 (따라서 공유 메모리 연결을 통한 NULL)이며 서버의 NetBios를 사용할 수없는 경우 누군가에게 제공 할 주소입니다. 어떤 이유로 이름 또는 FQDN.

이 답변 을 사용 하지 않는 것이 좋습니다. 셸 아웃을 활성화하는 것은 프로덕션 SQL Server에서 매우 나쁜 생각입니다.


3
49800이어야하는 포트에 대해 음수 포트 번호 (-15736)를받는 것을 제외하고는 좋은 대답입니다. 음수이면 65536을 추가하는 것이 안전합니까?
crokusek

누군가가 내 컴퓨터의 SQL 서버에 원격으로 로그인하려는 경우 어떤 IP를 제공합니까? local_net_address 또는 client_net_address?
david blaine 2013 년

@rene-그것을 고려하고 있었지만 원래 대답 자체는 정확하므로 (SQL2008 + 및 원격 연결의 경우) ConnectionProperty 매개 변수가 의미하는 바를 명확히하려고 생각했습니다. 물론 Chris Leonard의 대답 (dm_exec_connections)도 같은 이유로 정확합니다. 내 부록이 별도의 답변으로 더 낫다고 생각한다면 :) Qs에 한동안 답변하지 않았으므로 여기의 정책 및 규칙이 변경되었을 수 있습니다 (지금 읽어 보겠습니다 ...)
Martin S. 스톨 러

" stackoverflow.com/help/editing " 에 따른 추가 이유 : 게시물의 의미를 명확히하기 위해 (그 의미를 변경하지 않고).
Martin S. Stoller 2015

1
@ MartinS.Stoller 나는 준비를 위해 추가를 편집했습니다. 내가 놓친 것이 없는지 확인하십시오.
rene

33

다음을 통해 [hostname] \ [instancename]을 가져올 수 있습니다.

SELECT @@SERVERNAME;

호스트 이름 \ 인스턴스 이름 형식이있는 경우 호스트 이름 만 가져 오려면 :

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

또는 @GilM이 지적한대로 :

SELECT SERVERPROPERTY('MachineName')

다음을 사용하여 실제 IP 주소를 얻을 수 있습니다.

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

SQL 스크립트의 소스입니다 .


19

서버에는 수신 대기중인 여러 IP 주소가있을 수 있습니다. 연결에 VIEW SERVER STATE 서버 권한이 부여 된 경우이 쿼리를 실행하여 SQL Server에 연결 한 주소를 가져올 수 있습니다.

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

이 솔루션은 xp_cmdshell을 통해 OS로 쉘 아웃 할 필요가 없습니다. 이는 프로덕션 서버에서 비활성화 (또는 최소한 엄격하게 보안)해야하는 기술입니다. 적절한 로그인에 VIEW SERVER STATE를 부여해야 할 수도 있지만 xp_cmdshell을 실행하는 것보다 보안 위험이 훨씬 적습니다.

GilM에서 서버 이름에 대해 언급 한 기술이 선호되는 기술입니다.

SELECT SERVERPROPERTY(N'MachineName');

이 응답에 감사드립니다 ... 클라이언트의 연결 측에서 확인해야하는 경우 서버의 IP 주소를 결정하는 진정한 방법이라고 생각합니다. 특히 클라이언트의 연결이 SQL 별칭을 포함하거나 이름이 지정된 연결 문자열로 설정된 경우 인스턴스를 데이터 소스로 사용합니다.
Rodolfo G.

11

t-sql을 통해 IP 주소를 얻는 대부분의 솔루션은 다음 두 가지 유형에 속합니다.

  1. 출력을 ipconfig.exe통해 실행 xp_cmdshell하고 구문 분석

  2. DMV 조회 sys.dm_exec_connections

나는 옵션 # 1의 팬이 아닙니다. xp_cmdshell을 활성화하면 보안상의 단점이 있으며 어쨌든 많은 구문 분석이 필요합니다. 번거 롭습니다. 옵션 # 2는 우아합니다. 그리고 그것은 거의 항상 선호하는 순수한 t-sql 솔루션입니다. 다음은 옵션 # 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;

하지만 위의 쿼리 중 어느 것도 작동하지 않는 경우도 있습니다. 쿼리 # 1은 공유 메모리를 통해 연결되어있는 경우 (SQL 호스트에서 SSMS에 로그인하고 실행 중) NULL을 반환합니다. 비공유 메모리 프로토콜을 사용하는 연결이 없으면 쿼리 # 2가 아무 것도 반환하지 않을 수 있습니다. 이 시나리오는 새로 설치된 SQL 인스턴스에 연결되었을 때 발생합니다. 해결책? TCP / IP를 통해 강제로 연결합니다. 이렇게하려면 SSMS에서 새 연결을 만들고 서버 이름과 함께 "tcp :"접두사를 사용합니다. 그런 다음 쿼리를 다시 실행하면 IP 주소를 얻을 수 있습니다.

SSMS-데이터베이스 엔진에 연결


이것은 ipv4를 줄 것입니다 .. 우리는 ipv6를 얻을 수 있습니까?
Shikhil Bhalla


7

명령 줄 쿼리를 사용하고 mssql에서 실행할 수 있습니다.

exec xp_cmdshell 'ipconfig'

1
xp_cmdshell서버 보안 구성에서 활성화 된 경우에만 작동 합니다
Javasick

7

-이 스크립트를 사용해보십시오. 그것을 읽으려면 다시 포맷하십시오.

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;

감사. 함수에서 사용하려면 dec.local_tcp_port를 'dec.local_tcp_port'로 업데이트하면됩니다. 그렇지 않으면 local_tcp_port라는 두 개의 열이 있다고 불평합니다.
Steven Van Dorpe


2

\ InstanceName없이 머신 이름을 얻는 더 간단한 방법은 다음과 같습니다.

SELECT SERVERPROPERTY('MachineName')

1

나는 이것이 오래된 게시물이라는 것을 알고 있지만 아마도이 솔루션은 공유 메모리 연결에서 IP 주소와 TCP 포트를 검색하려는 경우 유용 할 수 있습니다 (예 : 서버에서 로컬로 SSMS에서 실행되는 스크립트에서). 핵심은 연결 문자열에 'tcp :'를 지정하는 OPENROWSET을 사용하여 SQL Server에 대한 보조 연결을 여는 것입니다. 나머지 코드는 변수를 매개 변수로 사용할 수 없다는 OPENROWSET의 한계를 극복하기 위해 동적 SQL을 빌드하는 것뿐입니다.

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

이 기능을 켜야한다는 점에 유의하십시오 Ad Hoc Distributed Queries.
Dan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.