Apakah ada kueri di SQL Server 2005 yang dapat saya gunakan untuk mendapatkan IP atau nama server?
sql
sql-server
Seibar
sumber
sumber
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.
sumber
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
Sumber skrip SQL .
sumber
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');
sumber
Sebagian besar solusi untuk mendapatkan alamat IP melalui t-sql termasuk dalam dua kubu berikut:
Jalankan
ipconfig.exe
melaluixp_cmdshell
dan parsing hasilnyaPermintaan 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.
sumber
Ini ada di variabel @@ SERVERNAME ;
SELECT @@SERVERNAME;
sumber
--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;
sumber
Anda dapat menggunakan kueri baris perintah dan mengeksekusi di mssql:
sumber
xp_cmdshell
diaktifkan dalam konfigurasi keamanan serverselect @@servername
sumber
Cara yang lebih sederhana untuk mendapatkan nama mesin tanpa \ InstanceName adalah:
SELECT SERVERPROPERTY('MachineName')
sumber
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
sumber
Ad Hoc Distributed Queries
dihidupkan.