এসকিউএল সার্ভার / ডাটাবেস কল্যাশনে মেলে না মিলে প্রতিটি কলাম পরিবর্তন করার চেয়ে সমাধান করার সহজ উপায়?


8

অস্বীকৃতি: আমি জানি যে এই প্রশ্নটি আগে একশোবার জিজ্ঞাসা করা হয়েছিল, তবে আমি কেবল এটি যাচাই করতে চেয়েছিলাম যে এর আগে আরও সহজ সমাধান না পেয়ে আমি মিস করতে পারি নি এবং এটি করার জন্য প্রচুর কোড লিখেছি / করেছি।

আমাদের সফ্টওয়্যারটি এমন একটি ডাটাবেস ব্যবহার করে যা মূলত এসকিউএল সার্ভার 7 এর জন্য ডিজাইন করা হয়েছিল এবং যেমনটি তৈরি করা সমস্ত স্ক্রিপ্টগুলি কোনও অক্ষর কলামের জন্য কোনও স্পষ্ট সংকলন নির্দিষ্ট করে না। পরিবর্তে, যখন এসকিউএল সার্ভার 2000 বা SQL_Latin1_General_CP1_CI_ASতারপরে একটি ডাটাবেস তৈরি করা / পুনরুদ্ধার করা হয়, তখন প্রতিটি কলাম ডেটাবেস কোলেশন উত্তরাধিকার সূত্রে প্রাপ্ত হয় (যা এটি এসকিউএল সার্ভার 7 ডিফল্ট হওয়ার পরে ঘটে )।

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

আমরা গ্রাহকদের আমাদের এসকিউএল সার্ভার ইনস্ট্যান্স ইনস্টল করতে বা পুনর্নির্মাণের জন্য আমাদের পছন্দের কলেজটি ব্যবহার করার চেষ্টা করেছি, তবে অবশ্যই এটি সর্বদা ঘটে না এবং এটি সর্বদা সম্ভব হয় না।

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

উত্তর:


6

একটি বিকল্প হ'ল মিলনের বিপরীতে আপনার কোড "প্রমাণ" করা।

আসল কোলেশন কী তা জেনে না জবরদস্তি করার জন্য আপনি "DATABASE_DEFAULT" বিশেষ কোলেশন ব্যবহার করতে পারেন। আপনি এটি টেম্প টেবিল, সারণী ভেরিয়েবল এবং সিস্টেম টেবিলগুলিতে আপনার ব্যবহার করতে হবে এমন চর কক্ষের কলামগুলিতে ব্যবহার করুন।

উদাহরণ:

CREATE TABLE #Currency (CCY CHAR(3))
GO
INSERT #Currency VALUES ('GBP')
INSERT #Currency VALUES ('CHF')
INSERT #Currency VALUES ('EUR')
GO
SELECT Something
FROM myTable M JOIN #Currency C ON M.CCY = C.CCY --error!
GO
-- in join too
SELECT Something
FROM myTable M JOIN #Currency C ON M.CCY = C.CCY COLLATE DATABASE_DEFAULT --no error
GO
DROP TABLE #Currency
GO


CREATE TABLE  #Currency (CCY CHAR(3) COLLATE DATABASE_DEFAULT)
GO
INSERT #Currency VALUES ('GBP')
INSERT #Currency VALUES ('CHF')
INSERT #Currency VALUES ('EUR')
GO
SELECT Something
FROM myTable M JOIN #Currency C ON M.CCY = C.CCY --no error!
GO

DROP TABLE #Currency
GO

এর অর্থ হ'ল যখন আপনার ক্লায়েন্টরা তাদের ডিবিকে অন্য একটি পৃথক কোলেশন সহ একটি নতুন হুইজি এসকিউএল সার্ভার বাক্সে স্থানান্তরিত করে, তখন এটি খুব কার্যকর হয় ...


2

সংক্ষিপ্ত উত্তর এখানে একটি সহজ উপায় নেই। আমি অতীতে একই সমস্যা ছিল।

আমি যা বলব তা 2 টি জিনিস, প্রথমে যখন আপনার গ্রাহক আপনাকে অপ্রত্যাশিত কোলেশন সহ একটি ডেটাবেস পাঠায়, তখন একটি নতুন এসকিউএল ইনস্টলস ডিফল্ট কোলিশের সাথে ইনস্টল করুন যা তাদের ডিবির সাথে মেলে এবং এর মধ্যে এটির সাথে কাজ করবে।

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

অথবা এমন একটি ইউটিলিটি লিখুন যা আপনার ডাটাবেজে সমস্ত টেবিল ইত্যাদির আপডেট করে দেবে যেমনটি আপনি বলেছিলেন, তবে এটি আপনি চাইলে আরও কাজ হতে পারে।


2

যদি ডাটাবেসে সমস্ত কলাম একই সংযোগের হয় তবে ক্রস-ডাটাবেস প্রশ্নগুলি তৈরি করার সময় এটি আপনার জন্য সমস্যা তৈরি করবে (বা আপনার অ্যাপ্লিকেশনটি সাজানোর ক্রম সংবেদনশীল)।

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

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