SQL Server 2005에 서버의 IP 또는 이름을 가져 오는 데 사용할 수있는 쿼리가 있습니까?
답변
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에서 매우 나쁜 생각입니다.
답변
다음을 통해 [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
답변
서버에는 수신 대기중인 여러 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');
답변
t-sql을 통해 IP 주소를 얻는 대부분의 솔루션은 다음 두 가지 유형에 속합니다.
-
출력을
ipconfig.exe
통해 실행xp_cmdshell
하고 구문 분석 -
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 주소를 얻을 수 있습니다.
답변
그것은에서의 @@ 서버 이름의 변수;
SELECT @@SERVERNAME;
답변
명령 줄 쿼리를 사용하고 mssql에서 실행할 수 있습니다.
exec xp_cmdshell 'ipconfig'
답변
-이 스크립트를 사용해보십시오. 그것을 읽으려면 다시 포맷하십시오.
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;