এসকিউএল - সার্ভারের আইপি ঠিকানা পেতে ক্যোয়ারী


97

এসকিউএল সার্ভার ২০০ in-এ কি কোয়েরি রয়েছে যা আমি সার্ভারের আইপি বা নাম পেতে পারি?


কোনও এজি শ্রোতা ব্যবহার করে এসকিউএল-এ সংযোগ করার সময়, এটি উপস্থিত হয় সংযোগপ্রাপ্তি ('লোকাল_নেট_ড্রেস') সার্ভার আইপির পরিবর্তে শ্রোতার আইপি প্রদান করে।
ব্রায়ান beuning

উত্তর:


148
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 

এখানে কোড আপনাকে আইপি ঠিকানা দেবে;

এটি এসকিউএল ২০০৮ এবং এর থেকে আরও নতুন ক্লায়েন্টের অনুরোধের জন্য কাজ করবে।

যদি আপনার কাছে ভাগ করা মেমোরি সংযোগগুলি অনুমোদিত থাকে তবে উপরে সার্ভারে চালানো আপনাকে দেবে

  • 'নেট_ট্রান্সপোর্ট' এর মান হিসাবে "ভাগ করা মেমোরি" এবং
  • 'লোকাল_নেট_ড্রেস' এর জন্য নুল, এবং
  • ' <local machine>' 'ক্লায়েন্ট_নেট_ড্রেস' এ দেখানো হবে।

'ক্লায়েন্ট_নেট_এড্রেস' হ'ল সেই কম্পিউটারের ঠিকানা যা থেকে অনুরোধটি এসেছে, যেখানে 'লোকাল_নেট_এড্রেস' হবে এসকিউএল সার্ভার (এইভাবে শেয়ার্ড মেমোরি সংযোগগুলি নাল করবে), এবং যদি আপনি সার্ভারের নেটবায়স ব্যবহার না করতে পারেন তবে আপনি যে ঠিকানাটি কাউকে দিবেন নাম বা এফকিউডিএন কোনও কারণে।

আমি এই উত্তরটি ব্যবহারের বিরুদ্ধে দৃ strongly়ভাবে পরামর্শ দিচ্ছি । শেল আউট সক্ষম করা একটি উত্পাদন এসকিউএল সার্ভারের উপর একটি খুব খারাপ ধারণা।


4
49800 হওয়া উচিত এমন একটি পোর্টের জন্য আমি নেতিবাচক পোর্ট নম্বর (-15736) পাচ্ছি তা ছাড়া উত্তম উত্তর So তাই যদি নেতিবাচক হয় তবে এটি কেবল 65536 যুক্ত করা নিরাপদ?
ক্রোকুসেক

যদি কেউ আমার কম্পিউটারের এসকিউএল সার্ভারে দূর থেকে লগইন করতে চান তবে আমি তাকে কোন আইপি দেব? লোকাল_নেট_এড্রেস বা ক্লায়েন্ট_নেট_এড্রেস?
ডেভিড ব্লেইন

@ রেন - এটি বিবেচনা করছিল, তবে আসল উত্তরটি নিজেই সঠিক (এসকিউএল ২০০৮ + এবং রিমোট সংযোগের জন্য) তাই সংযোগপ্রোপার্টি প্যারামগুলি কী বোঝাতে চেয়েছিল তা স্পষ্ট করে চিন্তা করার জন্য thought অবশ্যই ক্রিস লিওনার্ডের উত্তর (dm_exec_connifications) একই কারণেও সঠিক। আপনি যদি মনে করেন যে আমার সংযোজনটি এটির জন্য নির্দ্বিধায় পৃথক উত্তর হিসাবে ভাল বলে মনে হয়: কিছুক্ষণের জন্য Qs এর উত্তর দেয় নি, তাই এখানে নীতি ও বিধিগুলি পরিবর্তিত হতে পারে (এখনই সেগুলি পড়তে হবে ...)
মার্টিন এস S. স্টোলার

প্রতি "হিসাবে addenum কারণ stackoverflow.com/help/editing ": পোস্ট এর অর্থ নির্মল করার জন্য (অর্থ পরিবর্তন না করে)।
মার্টিন এস স্টোলার

4
@ মার্টিনস.স্টোলার আমি আপনার সংযোজনটি পাঠ্যের জন্য সম্পাদনা করেছি ited আমি কিছু মিস না করে দয়া করে পরীক্ষা করুন।
রেনে

33

আপনি [হোস্টনাম] get [উদাহরণস্বরূপ] এর মাধ্যমে পেতে পারেন:

SELECT @@SERVERNAME;

যখন আপনার হোস্ট-নাম \ উদাহরণের নাম ফর্ম্যাট থাকে কেবলমাত্র হোস্টনামটি পেতে:

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

বিকল্প হিসাবে @ গিলম উল্লেখ করেছেন:

SELECT SERVERPROPERTY('MachineName')

আপনি এটি ব্যবহার করে আসল আইপি ঠিকানাটি পেতে পারেন:

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

এসকিউএল স্ক্রিপ্টের উত্স


21

সার্ভারটির একাধিক আইপি ঠিকানা থাকতে পারে যা এটি শুনছে on যদি আপনার সংযোগটিতে ভিউ সার্ভার স্টেট সার্ভারের অনুমতি দেওয়া হয় তবে আপনি এসকিউএল সার্ভারের সাথে যে ঠিকানাটি সংযুক্ত করেছেন তা পাওয়ার জন্য আপনি এই ক্যোয়ারীটি চালাতে পারেন:

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

এই সমাধানটির জন্য আপনাকে xp_cmdshell এর মাধ্যমে ওএসের শেল আউট করার প্রয়োজন হয় না, এটি এমন একটি প্রযুক্তি যা একটি প্রোডাকশন সার্ভারে অক্ষম করা উচিত (বা কমপক্ষে কঠোরভাবে সুরক্ষিত)। আপনার উপযুক্ত লগইনটিতে সার্ভার স্টেটটি দেখার দরকার হতে পারে তবে এটি এক্সপি_সিএমডিএসেল চালনার চেয়ে সুরক্ষার চেয়ে অনেক কম ঝুঁকিপূর্ণ।

সার্ভার নামের জন্য গিলম দ্বারা উল্লিখিত কৌশলটি পছন্দসই:

SELECT SERVERPROPERTY(N'MachineName');

এই প্রতিক্রিয়াটির জন্য ধন্যবাদ ... আমি বিশ্বাস করি এটি যদি আপনি ক্লায়েন্টের সংযোগ দিক থেকে যাচাই করে নিতে চান তবে সার্ভারের আইপি ঠিকানাটি নির্ধারণের আসল উপায়, বিশেষত যদি ক্লায়েন্টের সংযোগটি কোনও এসকিউএল নাম বা সংযুক্ত একটি সংযোগ স্ট্রিংয়ের সাথে প্রতিষ্ঠিত হয় তবে উদাহরণস্বরূপ একটি তথ্য উত্স হিসাবে।
রোডলফো জি।

11

টি-স্কোরের মাধ্যমে আইপি ঠিকানা পাওয়ার বেশিরভাগ সমাধান এই দুটি শিবিরে পড়ে:

  1. ipconfig.exeমাধ্যমে চালান xp_cmdshellএবং আউটপুট পার্স

  2. অনুসন্ধান ডিএমভি sys.dm_exec_connections

আমি # 1 বিকল্পের অনুরাগী নই। এক্সপি_সিমিডেল সক্ষম করাতে সুরক্ষার ঘাটতি রয়েছে এবং যেভাবেই হোক প্রচুর পার্সিং জড়িত। এটাই বোঝা। বিকল্প # 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 নুলকে ফেরত দেয়। অবিহীন মেমরি প্রোটোকল ব্যবহার করে যদি কোনও সংযোগ না থাকে তবে ক্যোরি # 2 কিছুই ফিরিয়ে দিতে পারে না। কোনও নতুন ইনস্টল করা এসকিউএল ইনস্ট্যান্সের সাথে সংযুক্ত থাকাকালীন এই দৃশ্যটি সম্ভবত। সমাধান? টিসিপি / আইপি দিয়ে একটি সংযোগ জোর করে। এটি করতে, এসএসএমএসে একটি নতুন সংযোগ তৈরি করুন এবং সার্ভারের নামের সাথে "tcp:" উপসর্গটি ব্যবহার করুন। তারপরে কোয়েরিটি পুনরায় চালনা করুন এবং আপনি আইপি ঠিকানা পাবেন।

এসএসএমএস - ডেটাবেস ইঞ্জিনে সংযুক্ত করুন


এটি আইপিভি 4 দেবে .. আমরা কি আইপিভি 6 পেতে পারি?
শিখিল ভাল্লা


8

- এই স্ক্রিপ্টটি চেষ্টা করুন এটি আমার প্রয়োজন অনুযায়ী কাজ করে। এটি পড়তে পুনরায় ফর্ম্যাট করুন।

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 আপডেট করতে হয়েছিল। অন্যথায় এটি অভিযোগ করে যে স্থানীয়_tcp_port নামে দুটি কলাম রয়েছে।
স্টিভান ভ্যান ডরপ

7

আপনি কমান্ড লাইন ক্যোয়ারী ব্যবহার করতে পারেন এবং এমএসকিউএল চালাতে পারেন:

exec xp_cmdshell 'ipconfig'

4
এটি কেবলমাত্র xp_cmdshellসার্ভার সুরক্ষা কনফিগারেশনে সক্ষম থাকলেই কাজ করবে
জাভাসিক


2

\ ইনস্ট্যান্সনাম ছাড়াই মেশিনের নাম পাওয়ার সহজ উপায় হ'ল:

SELECT SERVERPROPERTY('MachineName')

1

আমি জানি এটি একটি পুরানো পোস্ট, তবে আপনি যখন শেয়ার্ড মেমোরি সংযোগ (যেমন সার্ভারে স্থানীয়ভাবে এসএসএমএসে চালিত স্ক্রিপ্ট থেকে) থেকে আইপি ঠিকানা এবং টিসিপি পোর্টটি পুনরুদ্ধার করতে চান তখন এই সমাধানটি কার্যকর হতে পারে। কীটি হ'ল ওপেনরোউসেট ব্যবহার করে আপনার এসকিউএল সার্ভারের সাথে একটি গৌণ সংযোগ খুলতে, আপনি নিজের সংযোগের স্ট্রিংয়ে 'tcp:' নির্দিষ্ট করেছেন specify কোডের বাকী অংশগুলি কেবল ওপেনরোউসেটের প্যারামিটার হিসাবে ভেরিয়েবল নিতে না পারার সীমাবদ্ধতার সীমাবদ্ধতার জন্য গতিশীল এসকিউএল তৈরি করছে।

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চালু করা দরকার তা উল্লেখ করে।
ড্যান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.