পটভূমি : আমি http://sqlfiddle.com (আমার সাইট) এ কাজ করছি এবং সেখানে অপব্যবহারের সম্ভাব্য একটি উপায় রোধ করার চেষ্টা করছি। আমি আশা করছি যে আমি বর্তমানে যে সমস্যার মুখোমুখি হয়েছি সে সম্পর্কে জিজ্ঞাসা করে আমি অজান্তেই সম্ভাব্য অপব্যবহারকে আরও খারাপ করে তুলি না, তবে আপনি কী করতে পারেন? আমি আপনাকে বিশ্বাস করি
আমি কোনও ব্যবহারকারীর প্রদত্ত লেনদেনের ব্লকের মধ্যে সুস্পষ্ট 'প্রতিশ্রুতিবদ্ধ' কল প্রদান থেকে বিরত রাখতে চাই। এসকিউএল ফিডল প্রসঙ্গে, লেনদেন ব্লক হ'ল কোড যা ডান পাশের প্যানেলে কার্যকর করা হয়। মূলত, আমি প্লেইনেক্সট এসকিউএল কমান্ডগুলির একটি তালিকাটি শেষ করে দিয়ে চলেছি এবং আমি নিশ্চিত করতে চাই যে তারা করা সমস্ত পরিবর্তনগুলি ব্যাচের শেষে ফিরে যাবে। সাধারণত, তাদের পরিবর্তনগুলি আবার ঘূর্ণায়মান হয়, তবে কখনও কখনও পাঠ্যের মধ্যে একটি স্পষ্ট 'প্রতিশ্রুতিবদ্ধ' বিবৃতি উপস্থিত থাকে এবং অবশ্যই আমার রোলব্যাকটি কাজ করবে না। এই স্পষ্ট প্রতিশ্রুতি খুব সম্ভবত ব্যবহারকারী দ্বারা এসকিউএল ফিডেলের স্কিমা ভাঙার চেষ্টা করা হয়, সুতরাং এতে কাজ করা অন্যান্য ব্যক্তিরা ত্রুটি দেখতে পাবে।
মূল পছন্দসই ফলাফল : আমি যদি সম্ভব হয় তবে জেডিবিসি পর্যায়ে সুস্পষ্ট প্রতিশ্রুতি অক্ষম করতে চাই। এটি কারণ আমাকে একাধিক ডাটাবেস ব্যাকএন্ড বিক্রেতাদের সমর্থন করতে হবে, এবং অবশ্যই প্রত্যেকেরই নীচের স্তরে তাদের কোচ রয়েছে।
ফলব্যাক বিকল্প : যদি সুস্পষ্ট কমিটগুলি নিষ্ক্রিয় করার জন্য জেডিবিসি কনফিগার করা সম্ভব না হয় তবে নীচের প্রতিটি ব্যাকেন্ডের জন্য একটি ব্যাচ প্রক্রিয়া করার সময় আমি সুস্পষ্ট কমিট সনাক্তকরণের সমাধানগুলির জন্য উন্মুক্ত: এসকিউএল সার্ভার, ওরাকল, মাইএসকিউএল এবং পোস্টগ্রিসকিউএল।
এসকিউএল সার্ভারের জন্য, আমি এই সমাধানটি ভেবেছিলাম: বিবৃতি কার্যকর করার আগে এক্সএমএল ক্যোয়ারী প্ল্যানটি পার্স করুন এবং এই এক্সপথের সাথে মেলে এমন একটি এন্ট্রির উপস্থিতি যাচাই করুন:
//*[@StatementType="COMMIT TRANSACTION"]
আমি মনে করি এটি এসকিউএল সার্ভারের জন্য বেশ ভালভাবে কাজ করবে। তবে অন্যান্য ডিবি ধরণের ক্ষেত্রে এই পদ্ধতির কাজ হয় না। সুস্পষ্ট কমিটের জন্য ওরাকলের এক্সএমএল এক্সিকিউশন প্ল্যান আউটপুট কোনও প্রতিশ্রুতি দেয় না যে আপনি একটি প্রতিশ্রুতিবদ্ধ বিবৃতি চালিয়ে যাচ্ছেন (বরং এটি সম্পাদন করা অনুসন্ধানগুলি থেকে এক্সিকিউশন প্ল্যান আউটপুট পুনরাবৃত্তি করে)। পোস্টগ্রিএসকিউএল এবং মাইএসকিউএল সুস্পষ্ট কমিটের জন্য কোনও এক্সিকিউশন প্ল্যান আউটপুট (XML বা অন্যথায়) সরবরাহ করে না।
এটি আমাকে "প্রতিশ্রুতিবদ্ধ" শব্দের প্রকৃত বিবৃতি চেক করে রাখে। সমস্ত ধরণের বৈকল্পিকের সম্ভাব্যতা বাদে এটি কার্যকর হবে:
declare @sql varchar(50)
set @sql = 'com' + 'mit'
exec(@sql);
উপরেরটি এসকিউএল সার্ভারের জন্য একটি উদাহরণ (যা আমি প্রায় কাজ করতে পারতাম), তবে আমি অনুমান করব যে ওরাকল, মাইএসকিউএল এবং পোস্টগ্রিসকিউএল একই রকম জিনিসগুলি সম্ভব হবে। আমি কি এই ধারণা নিয়ে ভুল করছি? হতে পারে তারা "গতিশীল" প্রতিশ্রুতিবদ্ধ বিবৃতিগুলিকে অনুমতি দেবে না? আপনি ওরাকল, মাইএসকিউএল এবং পোস্টগ্রেএসকিউএল তেমন কিছু ঘটতে পারছেন কিনা তা দেখতে এসকিউএল ফিডল নির্বিশেষে (স্যাম্পল স্কিমা বা অন্য কারও সাথে কাজ করার সম্ভাবনা নেই) নির্দ্বিধায় পড়ুন। যদি তা না হয় তবে সাধারণ স্ট্রিং সনাক্তকরণ তাদের জন্য কাজ করতে পারে।
তবুও আরেকটি সম্ভাবনা
আমার কাছে অন্য একটি বিকল্প উপস্থিত হয়েছিল - আপনি যদি এই ডাটাবেসগুলির কোনও পাঠ্যরূপে সেট করার কোনও উপায় সম্পর্কে জানেন তবে যেমন মোডে কোনও কিছুই প্রতিশ্রুতিবদ্ধ হতে পারে না, এটিও কার্যকর হতে পারে। আমাকে এখনও লেনদেন শুরু করার অনুমতি দেওয়া হবে এবং কোডগুলি সেগুলির মধ্যে চলতে দেওয়া উচিত, যতক্ষণ না সেই মোডে থাকাকালীন কোনও কিছু করা যায় না। এটা কি সম্ভব?
হালনাগাদ
আমি সম্প্রতি যা শিখেছি - এটি পোস্টগ্র্রেএসকিউএল নিয়ে আসলে সমস্যা নয়। দৃশ্যত কোনও লেনদেন ব্লকের মধ্যে জারি করা কমিটস প্রযোজ্য হবে না যদি একই ব্লকটি অবশেষে রোলড ব্যাক হয়ে যায় (পোস্টগ্রিসে)। তাই পোস্টগ্রিসের জন্য হুর!
ফিলের এসও পোস্টের লিঙ্কটির জন্য ধন্যবাদ, আমি মনে করি যে আমি যা করছি তা সম্পাদন করতে আমি ওরাকলের জন্য প্রাথমিকভাবে প্রেরিত হ্যাক ব্যবহার করতে পারি (কোন প্রতিশ্রুতি জারি করা হলে একটি ত্রুটি নিক্ষেপ করা হবে তবে আমি তার আশপাশে কাজ করতে পারি)। এটি ওরাকলকে সম্বোধন করা উচিত। (আমি এক মুহুর্তের জন্য ভেবেছিলাম যে নেস্টেড লেনদেনগুলি এখানে কাজ করতে পারে তবে মনে হয় না ওরাকল নেস্ট লেনদেনকে সমর্থন করে? যাইহোক আমি এইভাবে কাজ করে এমন কিছুই পাই না)
মাইএসকিউএল-এর এখনও কোনও সমাধান নেই। নেস্টেড লেনদেন ব্যবহার করার চেষ্টা করা হয়েছে, কিন্তু এটি কাজ করে না। আমি মাইএসকিউএল-এর জন্য আরও কঠোর পদ্ধতির বিষয়ে গুরুত্ব সহকারে চিন্তা করছি, যেমন হয় ডানদিকে SELECTs ছাড়া আর কিছুই মঞ্জুরি দেয় না বা প্রতিটি প্রশ্নের পরে ডিবি ছেড়ে / ফিরিয়ে নেওয়া। যদিও ভাল শোনাচ্ছে না।
সমাধান
সুতরাং, আমি এখন এসকিউএল সার্ভার এবং ওরাকল এর জন্য বর্ণিত সমাধানগুলি প্রয়োগ করেছি এবং আমি যেমন উল্লেখ করেছি যে এটি আসলে পোস্টগ্র্রেএসকিউএল এর জন্য কোনও সমস্যা নয়। মাইএসকিউএলের জন্য, আমি কেবলমাত্র বিবৃতি নির্বাচন করতে কোয়েরি প্যানেলকে সীমাবদ্ধ করার কিছুটা দুর্ভাগ্যজনক পদক্ষেপ নিয়েছি। মাইএসকিউএলের জন্য ডিডিএল এবং ডিএমএল কেবল স্কিমা প্যানেলে (বাম দিকে) প্রবেশ করতে হবে। আমি আশা করি এটি অনেকগুলি পুরানো ফিডলগুলি ভাঙ্গবে না, তবে আমি মনে করি এটি কেবলমাত্র ডেটা ধারাবাহিকতা নিশ্চিত করার জন্য করা উচিত। ধন্যবাদ!