দক্ষ এসকিউএল পরীক্ষা কোয়েরি বা বৈধতা কোয়েরি যা সমস্ত (বা বেশিরভাগ) ডাটাবেস জুড়ে কাজ করবে


148

অনেক ডেটাবেস সংযোগ পুলিং গ্রন্থাগারগুলি অলসতার জন্য তাদের এসকিউএল সংযোগগুলি পরীক্ষা করার ক্ষমতা সরবরাহ করে। উদাহরণস্বরূপ, জেডিবিসি পুলিং লাইব্রেরি c3p0 এর একটি সম্পত্তি বলা হয়েছে preferredTestQuery, যা কনফিগার করা বিরতিতে সংযোগে কার্যকর করা হয়। একইভাবে, অ্যাপাচি কমন্স ডিবিসিপি রয়েছে validationQuery

অনেক উদাহরণ প্রশ্নের আমি দেখেছি মাইএসকিউএল জন্য এবং ব্যবহার করার প্রস্তাব দিই SELECT 1;পরীক্ষা জিজ্ঞাসার জন্য মান হিসাবে। তবে, এই কোয়েরিটি কিছু ডাটাবেসে কাজ করে না (যেমন এইচএসকিউএলডিবি, যার জন্য SELECT 1কোনও FROMধারা প্রত্যাশা করে )।

এমন কোনও ডাটাবেস-অজ্ঞেয় সম্পর্কিত ক্যোয়ারী রয়েছে যা সমান দক্ষ কিন্তু সব এসকিউএল ডাটাবেসের জন্য কাজ করবে?

সম্পাদনা:

যদি না থাকে (যা এটি মনে হয়) তবে কেউ কি এসকিউএল কোয়েরিগুলির একটি সেট প্রস্তাব করতে পারেন যা বিভিন্ন ডাটাবেস সরবরাহকারীদের জন্য কাজ করবে? আমার উদ্দেশ্য হ'ল আমি আমার ডেটাবেস সরবরাহকারীর কনফিগারেশনের উপর ভিত্তি করে কোনও বিবৃতিটি প্রোগ্রামিয়ালি নির্ধারণ করতে পারি।



1
দ্রষ্টব্য: একটি পরীক্ষার ক্যোয়ারীটি কনফিগার করার দরকার নেই, আমার উত্তর নীচে দেখুন
টিম বাথ

উত্তর:


274

এখানে কিছু উত্তরের সাহায্যের সাথে সামান্য গবেষণা করার পরে:

SELECT 1

  • ও H2
  • মাইএসকিউএল
  • মাইক্রোসফ্ট এসকিউএল সার্ভার ( নিমচিম্পস্কি অনুসারে )
  • পোস্টগ্রি
  • SQLite

SELECT 1 FROM DUAL

  • আকাশবাণী

SELECT 1 FROM any_existing_table WHERE 1=0

অথবা

SELECT 1 FROM INFORMATION_SCHEMA.SYSTEM_USERS

  • এইচএসকিউএলডিবি (1.8.0.10 সংস্করণ দিয়ে পরীক্ষা করা)

    দ্রষ্টব্য: আমি WHERE 1=0দ্বিতীয় কোয়েরিতে একটি ধারা ব্যবহার করার চেষ্টা করেছি , তবে এটি অ্যাপাচি কমন্স ডিবিসিপি'র মান হিসাবে কাজ validationQueryকরে নি, যেহেতু ক্যোয়ারীটি কোনও সারি দেয় না


VALUES 1 অথবা SELECT 1 FROM SYSIBM.SYSDUMMY1

SELECT 1 FROM SYSIBM.SYSDUMMY1

  • DB2

select count(*) from systables

  • Informix

এটি "যে কোনও স্থানে_স্থানীয় 1_ 0" থেকে 1 টি নির্বাচন করুন - অন্যথায় কলটি খুব ধীর হতে পারে। যাইহোক, ডুয়াল থেকে SELECT 1 এবং নির্বাচন 1 টি উভয়ই H2 এর সাথে কাজ করে।
থমাস মোলার 14

2
আমি জানি এটি কয়েক বছরের পুরনো তবে আপনি উভয় VALUES 1এবং SELECT 1 FROM SYSIBM.SYSDUMMY1অ্যাপাচি ডার্বির জন্য যোগ করতে চাইতে পারেন
daiscog

ধরে নিচ্ছি ওপি জাভা উত্তর চায়: আমি বিশ্বাস করি জাভা 6 এর সাথে এই উত্তরটি এখন পুরানো। আমার উত্তর এই পৃষ্ঠায় অন্য কোথাও দেখুন।
পিটার

আপনি এই উত্তরে এই দুটি যুক্ত করতে পারেন, ডিবি 2: "সিসিবিএম.সিসডমি 1 থেকে বর্তমান তারিখটি নির্বাচন করুন" ইনফর্মিক্স: "সিস্টেবলগুলি থেকে গণনা (*) নির্বাচন করুন"
মাইকেল

@ মিশেল আপনি যদি কোনও সম্পাদনার পরামর্শ দিতে চান তবে আমি এটি অনুমোদন করব। এছাড়াও, আপনি এটির জন্য একটি বেশ কয়েকটি রেপ পয়েন্ট পাবেন।
রব হুরস্কা

22

যদি আপনার ড্রাইভারটি জেডিবিসি 4 অনুবর্তী হয় তবে সংযোগগুলি পরীক্ষা করার জন্য ডেডিকেটেড ক্যোয়ারীর দরকার নেই। পরিবর্তে, আছে Connection.isValid সংযোগ পরীক্ষা করা হবে।

জেডিবিসি 4 2006 থেকে জাভা 6 এর অংশ এবং আপনার চালককে এখনই এটি সমর্থন করা উচিত!

হিকারিসিপি-র মতো বিখ্যাত সংযোগ পুলগুলিতে এখনও পরীক্ষা কোয়েরি নির্দিষ্ট করার জন্য একটি কনফিগার প্যারামিটার রয়েছে তবে এটি ব্যবহারে দৃ strongly়রূপে নিরুৎসাহিত করুন:

🔠connectionTestQuery

যদি আপনার ড্রাইভার জেডিবিসি 4 সমর্থন করে তবে আমরা দৃ property়ভাবে এই সম্পত্তিটি সেট না করার পরামর্শ দিচ্ছি। এটি "উত্তরাধিকার" ডাটাবেসের জন্য যা জেডিবিসি 4 সংযোগ.আইভালিড () API সমর্থন করে না। এটি এমন ক্যোয়ারী যা ডেটাবেসের সাথে সংযোগটি এখনও বেঁচে আছে তা যাচাই করার জন্য পুল থেকে কোনও সংযোগ দেওয়ার আগে আপনাকে কার্যকর করা হবে। আবার, এই সম্পত্তিটি ছাড়াই পুল চালানোর চেষ্টা করুন, আপনার চালক জেডিবিসি 4 অনুপযুক্ত না হলে হিকারিসিপি একটি ত্রুটি লগ করবে। ডিফল্ট: কিছুই নয়


9

দুর্ভাগ্যক্রমে এমন কোনও নির্বাচনী বিবৃতি নেই যা ডেটাবেস নির্বিশেষে সর্বদা কাজ করবে।

বেশিরভাগ ডাটাবেস সমর্থন করে:

SELECT 1

কিছু ডেটাবেস এটি সমর্থন করে না তবে ডুয়াল নামে একটি টেবিল রয়েছে যা আপনি যখন টেবিলের প্রয়োজন নেই তখন আপনি ব্যবহার করতে পারেন:

SELECT 1 FROM DUAL

মাইএসকিউএল এটি সামঞ্জস্যতার কারণেও সমর্থন করে তবে সমস্ত ডাটাবেস তা করে না। উপরের যে কোনওটি সমর্থন করে না এমন ডেটাবেসগুলির জন্য একটি কার্যপ্রণালী হ'ল ডুয়াল নামে একটি সারণী তৈরি করা যাতে একক সারি থাকে, তারপরে উপরেরটি কাজ করবে।

এইচএসকিউএলডিবি উপরের কোনওটিকে সমর্থন করে না, তাই আপনি হয় ডুয়াল টেবিল তৈরি করতে পারেন বা অন্যথায় ব্যবহার করতে পারেন:

SELECT 1 FROM any_table_that_you_know_exists_in_your_database

উত্তর করার জন্য ধন্যবাদ. আপনার "আমার কাছে এমন কোনও নির্বাচনী বিবৃতি নেই যা সর্বদা কার্যকর হবে" বিবৃতিটির কারণে আমি আমার প্রশ্নটি সামান্য আপডেট করেছি। SELECT 1 FROM DUALএইচএসকিউএলডিবিতেও কাজ করে না।
রব হুশকা

1
+1, বিশেষত এইচএসকিউএলডি মামলার জন্য আমি যেখানে আমার গবেষণাটি নিয়ে এসেছি তা এখানে।
রব হুশকা

কোনটি "নির্বাচন 1" সমর্থন করে না? দ্বৈত থেকে নির্বাচন করুন কাজ করে না কেবল ওরাকল?
এসকিএল

+1 আমি একটি আরডিবিএমএস স্বতন্ত্র উপায়ে চিন্তা করার চেষ্টা ছেড়ে দিয়েছি!
মার্টিন স্মিথ

2

আমি এটি ব্যবহার করি:

select max(table_catalog) as x from information_schema.tables

পোস্টগ্রেএসকিউএল, মাইএসকিউএল এবং এমএসএসকিউএলের জন্য সংযোগ এবং ক্যুরিগুলি (ফলস্বরূপ 1 টি সারি সহ) চালনার দক্ষতা পরীক্ষা করতে।


2

আমি ব্যবহার করি

Select COUNT(*) As X From INFORMATION_SCHEMA.SYSTEM_USERS Where 1=0

hsqldb 1.8.0 এর জন্য


2

ব্যবহার পরীক্ষার জন্য select count(*), এটি ব্যবহার করার জন্য আরও দক্ষ হওয়া উচিত select count(1)কারণ *এটা হতে সব কলাম ডেটা পড়তে পারবেন না।


1

select 1 অন্যদের সম্পর্কে নিশ্চিত নয়, স্কয়ার সার্ভারে কাজ করবে।

একটি সারণী তৈরি করতে স্ট্যান্ডার্ড আনসি এসকিএল এবং তারপরে সেই টেবিলটি থেকে কোয়েরি ব্যবহার করুন।


আনসি এসকিউএল কভার করে create table?
মার্টিন স্মিথ

হ্যাঁ এটা করে. আপনি যদি অ্যানসি ডাটা টাইপ ব্যবহার করেন। যদিও "সিলেক্ট 1" কাজ না করে আমি অবাক হব।
নিমচিম্পস্কি

1

ধরে নিই যে ওপি জাভা উত্তর চায়:

জেডিবিসি 3 / জাভা 6 হিসাবে আছে ভ্যাবল () পদ্ধতি যা নিজস্ব পদ্ধতি আবিষ্কারের পরিবর্তে ব্যবহার করা উচিত।

ড্রাইভারের প্রয়োগকারীকে এই পদ্ধতির আইডি কল করার সময় ডাটাবেসের বিরুদ্ধে কোনও ধরণের কোয়েরি চালানো দরকার। আপনাকে - নিছক জেডিবিসি ব্যবহারকারী হিসাবে - এই কোয়েরিটি কী তা জানতে বা বুঝতে হবে না। আপনাকে যা করতে হবে তা বিশ্বাস করতে হবে যে জেডিবিসি ড্রাইভারের স্রষ্টা তার কাজটি সঠিকভাবে করেছেন।


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

এটিও লক্ষণীয় যে "জেডিবিসি ড্রাইভারের স্রষ্টা তার কাজটি সঠিকভাবে করেছেন" সত্যিই গ্যারান্টিযুক্ত নয়। আমি সবেমাত্র জানতে পেরেছি যে পোস্টগ্র্রেস, এইচএসকিউএলডি বা এইচ 2 উভয়ই এই পদ্ধতিটি বাস্তবায়নের জন্য বিরক্ত করেনি, তাই এটি সর্বদা সেখানে একটি ব্যতিক্রম বাড়িয়ে তুলবে।
আকরোয়

1

কেমন

SELECT user()

আমি এটি আগে ব্যবহার করি M মাইএসকিউএল, এইচ 2 ঠিক আছে, আমি অন্যকে জানি না।


1

সবেমাত্র এটি শক্ত পথটি খুঁজে পেয়েছি

SELECT 1 FROM DUAL

ম্যাক্সডিবির জন্যও।



আমি এটি পাই না, এটি গৃহীত উত্তরের সাথে মান যোগ করে, তাই সমস্যা কোথায়?
লার্স ডেকার

এবং যেমনটি আপনি উল্লেখ করেছেন: যেমন আমি গৃহীত উত্তরের মন্তব্য করতে পারি না, তাই আমি এটি এখানে একটি উত্তর হিসাবে রেখেছি। এত ভাল পোস্ট পোস্ট না করা যদিও এটি কেবল খ্যাতি হারিয়ে যাওয়ার কারণে সহায়ক হতে পারে?
লার্স ডেকার

টিবিএইচ, এটি নিকটতম কল ... একটি উত্তর সদৃশ করার পরিবর্তে এটি মূল উত্তর সম্পর্কে একটি মন্তব্য হওয়া উচিত ছিল । এটি ব্যর্থ হয়ে আপনি মূলটিতে প্রস্তাবিত সম্পাদনা করতে পারতেন।
পিটার ব্রিটেন

1

ওরাকল এর জন্য উচ্চ সম্পাদনকারী ক্যোয়ারী হবে

select 'X' from <your_small_table> where <primay_key_coulmn> = <some_value>

এটি পারফরম্যান্সের দৃষ্টিকোণ থেকে।


0

আমি এটি ফায়ারবার্ডের জন্য ব্যবহার করি

select 1 from RDB$RELATION_FIELDS rows 1

0

জন্য এমএস স্কুয়েল

এটি আমাকে লিঙ্কযুক্ত সার্ভারগুলি বেঁচে ছিল কিনা তা নির্ধারণে সহায়তা করেছিল। ত্রুটির ফলাফলগুলি কার্যকর কিছুতে রাখার জন্য একটি ওপেন ক্যোয়ারী সংযোগ এবং একটি ট্রাই ক্যাচ ব্যবহার করা।

IF OBJECT_ID('TEMPDB..#TEST_CONNECTION') IS NOT NULL DROP TABLE #TEST_CONNECTION
IF OBJECT_ID('TEMPDB..#RESULTSERROR') IS NOT NULL DROP TABLE #RESULTSERROR
IF OBJECT_ID('TEMPDB..#RESULTSGOOD') IS NOT NULL DROP TABLE #RESULTSGOOD

DECLARE @LINKEDSERVER AS VARCHAR(25)    SET @LINKEDSERVER = 'SERVER NAME GOES HERE'
DECLARE @SQL AS VARCHAR(MAX)
DECLARE @OPENQUERY AS VARCHAR(MAX)

--IF OBJECT_ID ('dbo.usp_GetErrorInfo', 'P' ) IS NOT NULL DROP PROCEDURE usp_GetErrorInfo;  
--GO  

---- Create procedure to retrieve error information.  
--CREATE PROCEDURE dbo.usp_GetErrorInfo  
--AS  
--SELECT     
--    ERROR_NUMBER() AS ErrorNumber  
--    ,ERROR_SEVERITY() AS ErrorSeverity  
--    ,ERROR_STATE() AS ErrorState  
--    ,ERROR_PROCEDURE() AS ErrorProcedure  
--    ,ERROR_LINE() AS ErrorLine  
--    ,ERROR_MESSAGE() AS Message;  
--GO  


BEGIN TRY
SET @SQL='
SELECT 1 
'''
--SELECT @SQL
SET @OPENQUERY = 'SELECT * INTO ##TEST_CONNECTION FROM OPENQUERY(['+ @LINKEDSERVER +'],''' + @SQL + ')'
--SELECT @OPENQUERY
EXEC(@OPENQUERY)
SELECT * INTO #TEST_CONNECTION FROM ##TEST_CONNECTION
DROP TABLE ##TEST_CONNECTION
--SELECT * FROM #TEST_CONNECTION
END TRY

BEGIN CATCH
-- Execute error retrieval routine.
IF OBJECT_ID('dbo.usp_GetErrorInfo') IS NOT NULL -- IT WILL ALWAYS HAVE SOMTHING... 
    BEGIN
        CREATE TABLE #RESULTSERROR (
        [ErrorNumber]       INT
        ,[ErrorSeverity]    INT
        ,[ErrorState]       INT
        ,[ErrorProcedure]   INT
        ,[ErrorLine]        INT
        ,[Message]          NVARCHAR(MAX) 
        )
        INSERT INTO #RESULTSERROR
        EXECUTE dbo.usp_GetErrorInfo
    END
END CATCH

BEGIN 
    IF (Select ERRORNUMBER FROM #RESULTSERROR WHERE ERRORNUMBER = '1038') IS NOT NULL --'1038' FOR ME SHOWED A CONNECTION ATLEAST. 
        SELECT
        '0' AS [ErrorNumber]        
        ,'0'AS [ErrorSeverity]  
        ,'0'AS [ErrorState]     
        ,'0'AS [ErrorProcedure] 
        ,'0'AS [ErrorLine]      
        , CONCAT('CONNECTION IS UP ON ', @LINKEDSERVER) AS [Message]            
    ELSE 
        SELECT * FROM #RESULTSERROR
END

docs.microsoft.com

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.