জেডিবিসিতে সুস্পষ্ট কমিটগুলি অক্ষম করুন, এসকিউএল এগুলি সনাক্ত করুন বা ডাটাবেসটিকে কেবল পাঠযোগ্য অবস্থায় রাখুন


12

পটভূমি : আমি http://sqlfiddle.com (আমার সাইট) এ কাজ করছি এবং সেখানে অপব্যবহারের সম্ভাব্য একটি উপায় রোধ করার চেষ্টা করছি। আমি আশা করছি যে আমি বর্তমানে যে সমস্যার মুখোমুখি হয়েছি সে সম্পর্কে জিজ্ঞাসা করে আমি অজান্তেই সম্ভাব্য অপব্যবহারকে আরও খারাপ করে তুলি না, তবে আপনি কী করতে পারেন? আমি আপনাকে বিশ্বাস করি

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

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

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

এসকিউএল সার্ভারের জন্য, আমি এই সমাধানটি ভেবেছিলাম: বিবৃতি কার্যকর করার আগে এক্সএমএল ক্যোয়ারী প্ল্যানটি পার্স করুন এবং এই এক্সপথের সাথে মেলে এমন একটি এন্ট্রির উপস্থিতি যাচাই করুন:

//*[@StatementType="COMMIT TRANSACTION"]

আমি মনে করি এটি এসকিউএল সার্ভারের জন্য বেশ ভালভাবে কাজ করবে। তবে অন্যান্য ডিবি ধরণের ক্ষেত্রে এই পদ্ধতির কাজ হয় না। সুস্পষ্ট কমিটের জন্য ওরাকলের এক্সএমএল এক্সিকিউশন প্ল্যান আউটপুট কোনও প্রতিশ্রুতি দেয় না যে আপনি একটি প্রতিশ্রুতিবদ্ধ বিবৃতি চালিয়ে যাচ্ছেন (বরং এটি সম্পাদন করা অনুসন্ধানগুলি থেকে এক্সিকিউশন প্ল্যান আউটপুট পুনরাবৃত্তি করে)। পোস্টগ্রিএসকিউএল এবং মাইএসকিউএল সুস্পষ্ট কমিটের জন্য কোনও এক্সিকিউশন প্ল্যান আউটপুট (XML বা অন্যথায়) সরবরাহ করে না।

এটি আমাকে "প্রতিশ্রুতিবদ্ধ" শব্দের প্রকৃত বিবৃতি চেক করে রাখে। সমস্ত ধরণের বৈকল্পিকের সম্ভাব্যতা বাদে এটি কার্যকর হবে:

declare @sql varchar(50)
set @sql = 'com' + 'mit'
exec(@sql);

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

তবুও আরেকটি সম্ভাবনা

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

হালনাগাদ

আমি সম্প্রতি যা শিখেছি - এটি পোস্টগ্র্রেএসকিউএল নিয়ে আসলে সমস্যা নয়। দৃশ্যত কোনও লেনদেন ব্লকের মধ্যে জারি করা কমিটস প্রযোজ্য হবে না যদি একই ব্লকটি অবশেষে রোলড ব্যাক হয়ে যায় (পোস্টগ্রিসে)। তাই পোস্টগ্রিসের জন্য হুর!

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

মাইএসকিউএল-এর এখনও কোনও সমাধান নেই। নেস্টেড লেনদেন ব্যবহার করার চেষ্টা করা হয়েছে, কিন্তু এটি কাজ করে না। আমি মাইএসকিউএল-এর জন্য আরও কঠোর পদ্ধতির বিষয়ে গুরুত্ব সহকারে চিন্তা করছি, যেমন হয় ডানদিকে SELECTs ছাড়া আর কিছুই মঞ্জুরি দেয় না বা প্রতিটি প্রশ্নের পরে ডিবি ছেড়ে / ফিরিয়ে নেওয়া। যদিও ভাল শোনাচ্ছে না।

সমাধান

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


উল্লেখযোগ্য - আমি "প্রাক-কমিট" ট্রিগারগুলি অনুসন্ধান করেও অনেক গবেষণা করেছি। এটি উপস্থিত রয়েছে বলে মনে হয়, সুতরাং দুর্ভাগ্যক্রমে এটি কোনও বিকল্পও নয়।
জেক ফ্যাসেল

2
ওরাকল জন্য, এই সংক্রামক করে একটি ভাল গোপন পথ মত মনে হয়: stackoverflow.com/a/6463800/790702 কি তিনি উল্লেখ নয় যে 2nd অবস্থা বন্ধ করতে খুব আপনার কোডে বাধ্যতা লঙ্ঘন ধরা, সক্ষম হওয়া উচিত নয় ঘটমান।
ফিলি

@ ফিলের একমাত্র সমস্যাটি হ'ল আমার প্রত্যেকটি সারণির সংজ্ঞা (যা বাম প্যানেলে সংজ্ঞায়িত করা হয়েছে) এর নিয়ন্ত্রণ নেই (এবং সত্যই চান না)। সুতরাং যে স্থানীয়ভাবে প্রসারণযোগ্য ডিফার্ড ক্লজটি সেখানে থাকবে না (যদি না সমস্ত টেবিলের জন্য স্বয়ংক্রিয়ভাবে এটি করার কিছু উপায় থাকে - কোনও সিস্টেম ট্রিগারের মাধ্যমে বলুন যা টেবিলের বিবৃতি তৈরি করতে প্রতিক্রিয়া জানায়? উঘ)
জ্যাক ফ্যাসেল

1
@ নিকচ্যামাস আমাকে কমিটগুলি অক্ষম করতে হবে যাতে আমি স্কিমা (বাম পাশের প্যানেল দ্বারা নির্ধারিত হিসাবে) একটি স্থিত অবস্থায় রাখতে পারি। একই সমস্যা সমাধানের চেষ্টা করে একই স্কিমার বিপরীতে কোয়েরি লিখেছেন এমন বহু লোক থাকতে পারে। তাদের একে অপরের সাথে হস্তক্ষেপ রোধ করতে, কাঠামো এবং ডেটা পরিবর্তন থেকে রক্ষা করা আমার নিশ্চিত হওয়া দরকার। এটি রোলড-ব্যাক লেনদেনের মাধ্যমে সম্পন্ন হয়, তবে ডানদিকের কোডটি প্রতিশ্রুতিবদ্ধ থাকলে তা ঘটে না।
জেক ফ্যাসেল

2
@ রিকজেমস ডিডিএল মাইএসকিউএল এবং ওরাকলে অন্তর্নিহিত কমিট তৈরি করে তবে পোস্টগ্রিসএসকিউএল বা এসকিউএল সার্ভারে নয়। এই পোস্টটি অনুসরণ করার পরে আমি যে পদ্ধতিগুলি প্রয়োগ করেছি সেগুলি সেই উদ্বেগকে পরিচালনা করে। যতক্ষণ না স্বেচ্ছাসেবী এসকিউএল প্রবেশ করানো - এটিই পুরো বিষয়টি!
জ্যাক ফ্যাসেল

উত্তর:


3

ওরাকল-এর কাছে এটি COMMITs ধরার জন্য ভাল ছদ্মবেশী উপায় বলে মনে হচ্ছে:

/programming//a/6463800/790702

তিনি যা উল্লেখ করেন না তা হ'ল ২ য় পরিস্থিতি সংঘটিত হওয়ার জন্য আপনার কোডটিতেও সীমাবদ্ধতা লঙ্ঘন করতে সক্ষম হবেন।


দুর্দান্ত, আবারও ফিল ফিল। আমি ওরাকলের জন্য এই কৌশলটির ভাল ব্যবহার করতে সক্ষম হয়েছি। এটি আমাকে অন্যান্য ডাটাবেসগুলি স্থগিত প্রতিবন্ধকতাগুলিকে সমর্থন করতে সহায়তা করে।
জেক ফ্যাসেল

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