এসকিউএল সার্ভার ২০০ in-এ কি কোয়েরি রয়েছে যা আমি সার্ভারের আইপি বা নাম পেতে পারি?
উত্তর:
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়ভাবে পরামর্শ দিচ্ছি । শেল আউট সক্ষম করা একটি উত্পাদন এসকিউএল সার্ভারের উপর একটি খুব খারাপ ধারণা।
আপনি [হোস্টনাম] 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
সার্ভারটির একাধিক আইপি ঠিকানা থাকতে পারে যা এটি শুনছে on যদি আপনার সংযোগটিতে ভিউ সার্ভার স্টেট সার্ভারের অনুমতি দেওয়া হয় তবে আপনি এসকিউএল সার্ভারের সাথে যে ঠিকানাটি সংযুক্ত করেছেন তা পাওয়ার জন্য আপনি এই ক্যোয়ারীটি চালাতে পারেন:
SELECT dec.local_net_address
FROM sys.dm_exec_connections AS dec
WHERE dec.session_id = @@SPID;
এই সমাধানটির জন্য আপনাকে xp_cmdshell এর মাধ্যমে ওএসের শেল আউট করার প্রয়োজন হয় না, এটি এমন একটি প্রযুক্তি যা একটি প্রোডাকশন সার্ভারে অক্ষম করা উচিত (বা কমপক্ষে কঠোরভাবে সুরক্ষিত)। আপনার উপযুক্ত লগইনটিতে সার্ভার স্টেটটি দেখার দরকার হতে পারে তবে এটি এক্সপি_সিএমডিএসেল চালনার চেয়ে সুরক্ষার চেয়ে অনেক কম ঝুঁকিপূর্ণ।
সার্ভার নামের জন্য গিলম দ্বারা উল্লিখিত কৌশলটি পছন্দসই:
SELECT SERVERPROPERTY(N'MachineName');
টি-স্কোরের মাধ্যমে আইপি ঠিকানা পাওয়ার বেশিরভাগ সমাধান এই দুটি শিবিরে পড়ে:
ipconfig.exeমাধ্যমে চালান xp_cmdshellএবং আউটপুট পার্স
অনুসন্ধান ডিএমভি 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:" উপসর্গটি ব্যবহার করুন। তারপরে কোয়েরিটি পুনরায় চালনা করুন এবং আপনি আইপি ঠিকানা পাবেন।
এটি @@ 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;
আপনি কমান্ড লাইন ক্যোয়ারী ব্যবহার করতে পারেন এবং এমএসকিউএল চালাতে পারেন:
exec xp_cmdshell 'ipconfig'
xp_cmdshellসার্ভার সুরক্ষা কনফিগারেশনে সক্ষম থাকলেই কাজ করবে
select @@servername
আমি জানি এটি একটি পুরানো পোস্ট, তবে আপনি যখন শেয়ার্ড মেমোরি সংযোগ (যেমন সার্ভারে স্থানীয়ভাবে এসএসএমএসে চালিত স্ক্রিপ্ট থেকে) থেকে আইপি ঠিকানা এবং টিসিপি পোর্টটি পুনরুদ্ধার করতে চান তখন এই সমাধানটি কার্যকর হতে পারে। কীটি হ'ল ওপেনরোউসেট ব্যবহার করে আপনার এসকিউএল সার্ভারের সাথে একটি গৌণ সংযোগ খুলতে, আপনি নিজের সংযোগের স্ট্রিংয়ে '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চালু করা দরকার তা উল্লেখ করে।