サーバーのIPまたは名前を取得するために使用できるSQL Server 2005のクエリはありますか?
回答:
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以降へのリモートクライアント要求に対して機能します。
共有メモリ接続が許可されている場合、サーバー上で上記を実行すると、
<local machine>」は「client_net_address」に表示されます。「client_net_address」は要求の発信元のコンピューターのアドレスですが、「local_net_address」はSQLサーバー(したがって共有メモリー接続ではNULL)であり、サーバーのNetBiosを使用できない場合に誰かに与えるアドレスです何らかの理由で名前またはFQDN。
私はこの回答を使用しないことを強くお勧めします。シェルを有効にすることは、運用SQL Serverでは非常に悪い考えです。
[ホスト名] \ [インスタンス名]は次の方法で取得できます。
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アドレスを取得するためのほとんどのソリューションは、次の2つの方法に分類されます。
ipconfig.exe経由xp_cmdshellで実行して出力を解析する
DMVのクエリ sys.dm_exec_connections
私はオプション#1のファンではありません。xp_cmdshellを有効にすると、セキュリティ上の欠点があり、とにかく多くの解析が必要になります。それは面倒です。オプション#2はエレガントです。そして、それは純粋なt-sqlソリューションであり、ほとんどの場合私はそれを好みます。オプション#2の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アドレスが取得されます。
それは中です@@ SERVERNAMEの変数。
SELECT @@SERVERNAME;
-私のニーズに合ったこのスクリプトを試してください。再フォーマットして読み取ります。
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;
私はこれが古い投稿であることを知っていますが、共有メモリ接続からIPアドレスとTCPポートを取得する場合(たとえば、サーバーのローカルでSSMSで実行されたスクリプトから)にこのソリューションが役立つ場合があります。重要なのは、OPENROWSETを使用してSQL Serverへのセカンダリ接続を開くことです。この場合、接続文字列で「tcp:」を指定します。残りのコードは、動的SQLを構築して、変数をパラメーターとして使用できないというOPENROWSETの制限を回避するだけです。
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をオンにする必要があることに注意してください。