Apakah ada kueri di SQL Server 2005 yang dapat saya gunakan untuk mendapatkan IP atau nama server?
Jawaban:
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
Kode di sini akan memberi Anda Alamat IP;
Ini akan bekerja untuk permintaan klien jarak jauh ke SQL 2008 dan yang lebih baru.
Jika Anda memiliki koneksi Memori Bersama yang diizinkan, maka menjalankan di atas pada server itu sendiri akan memberi Anda
<local machine>' akan ditampilkan di 'client_net_address'.'client_net_address' adalah alamat komputer tempat permintaan berasal, sedangkan 'local_net_address' adalah server SQL (dengan demikian NULL melalui koneksi Memori Bersama), dan alamat yang akan Anda berikan kepada seseorang jika mereka tidak dapat menggunakan NetBios server nama atau FQDN untuk beberapa alasan.
Saya sangat menyarankan agar tidak menggunakan jawaban ini . Mengaktifkan shell out adalah ide yang sangat buruk pada SQL Server produksi.
Anda bisa mendapatkan [nama host] \ [nama instan] dengan:
SELECT @@SERVERNAME;
Untuk mendapatkan hanya nama host ketika Anda memiliki nama host \ format nama instance:
SELECT LEFT(ltrim(rtrim(@@ServerName)), Charindex('\', ltrim(rtrim(@@ServerName))) -1)
Atau seperti yang ditunjukkan @GilM:
SELECT SERVERPROPERTY('MachineName')
Anda bisa mendapatkan alamat IP sebenarnya menggunakan ini:
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
Server mungkin memiliki beberapa alamat IP yang didengarkannya. Jika koneksi Anda memiliki izin server LIHAT SERVER NEGARA yang diberikan, Anda dapat menjalankan kueri ini untuk mendapatkan alamat yang telah Anda sambungkan ke SQL Server:
SELECT dec.local_net_address
FROM sys.dm_exec_connections AS dec
WHERE dec.session_id = @@SPID;
Solusi ini tidak mengharuskan Anda untuk membayar ke OS melalui xp_cmdshell, yang merupakan teknik yang harus dinonaktifkan (atau setidaknya diamankan secara ketat) di server produksi. Anda mungkin diminta untuk memberikan LIHAT NEGARA SERVER untuk login yang sesuai, tetapi itu adalah risiko keamanan yang jauh lebih kecil daripada menjalankan xp_cmdshell.
Teknik yang disebutkan oleh GilM untuk nama server adalah yang lebih disukai:
SELECT SERVERPROPERTY(N'MachineName');
Sebagian besar solusi untuk mendapatkan alamat IP melalui t-sql termasuk dalam dua kubu berikut:
Jalankan ipconfig.exemelalui xp_cmdshelldan parsing hasilnya
Permintaan DMV sys.dm_exec_connections
Saya bukan penggemar opsi # 1. Mengaktifkan xp_cmdshell memiliki kelemahan keamanan, dan ada banyak penguraian yang terlibat. Itu tidak praktis. Opsi # 2 elegan. Dan ini adalah solusi t-sql murni, yang hampir selalu saya sukai. Berikut adalah dua contoh kueri untuk opsi # 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;
Terkadang, tidak satu pun dari kueri di atas berfungsi. Kueri # 1 mengembalikan NULL jika Anda terhubung melalui Memori Bersama (masuk dan menjalankan SSMS pada host SQL). Permintaan # 2 mungkin tidak menghasilkan apa-apa jika tidak ada koneksi yang menggunakan protokol non-Shared Memory. Skenario ini mungkin terjadi saat terhubung ke contoh SQL yang baru diinstal. Solusinya? Paksa koneksi melalui TCP / IP. Untuk melakukannya, buat koneksi baru di SSMS dan gunakan awalan "tcp:" dengan nama server. Kemudian jalankan kembali salah satu kueri dan Anda akan mendapatkan alamat IP.
Ini ada di variabel @@ SERVERNAME ;
SELECT @@SERVERNAME;
--Coba skrip ini sesuai kebutuhan saya. Format ulang untuk membacanya.
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;
Anda dapat menggunakan kueri baris perintah dan mengeksekusi di mssql:
exec xp_cmdshell 'ipconfig'
xp_cmdshelldiaktifkan dalam konfigurasi keamanan server
select @@servername
Saya tahu ini adalah posting lama, tetapi mungkin solusi ini dapat berguna ketika Anda ingin mengambil alamat IP dan port TCP dari koneksi Memori Bersama (misalnya dari skrip yang dijalankan di SSMS secara lokal di server). Kuncinya adalah membuka koneksi sekunder ke SQL Server menggunakan OPENROWSET, di mana Anda menentukan 'tcp:' di string koneksi Anda. Sisa kode hanya membangun SQL dinamis untuk mengatasi batasan OPENROWSET karena tidak dapat menggunakan variabel sebagai parameternya.
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 Queriesdihidupkan.