সঞ্চিত প্রক্রিয়া তৈরি করার সময় টেবিলটি উপস্থিত থাকলেও কী স্থগিত নাম রেজোলিউশনকে বাধ্য করার কোনও উপায় আছে?


10

এসকিউএল সার্ভারে একটি সঞ্চিত পদ্ধতি তৈরি করার সময়, আপনাকে অস্তিত্ব নেই এমন টেবিলগুলি উল্লেখ করার অনুমতি দেওয়া হয়। তবে, যদি টেবিলটি বিদ্যমান থাকে তবে আপনি যে পদ্ধতিতে উল্লিখিত কোনও কলাম অবশ্যই সেই সারণীতে থাকতে হবে (স্থিত নাম রেজোলিউশন )।

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

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

নীচে সি # এর দ্বারা নির্মিত এসকিউএল এর একটি আধ্যাত্মিক উদাহরণ দেওয়া হয়েছে যা আমি যে সমস্যার সমাধান করতে চাইছি তা "চিত্রিত" করে।

--Say this table already exists.
CREATE TABLE myTable
(
    a NVARCHAR(MAX)
)
GO

--My C# code creates something like this
BEGIN TRAN 
GO

--the stored procedure gets generated first.
CREATE PROCEDURE mySproc
AS
BEGIN
    SELECT a,b FROM myTable
END

--then the table update
ALTER TABLE myTable
    ADD b nvarchar(MAX)

COMMIT TRAN 

এটি আমার জন্য সি # কোডে ঠিক করা সম্ভব, তবে আমি এসকিউএলটি টানতে পারি এমন একটি সহজ "যাদু" টুইটের আশা করছি। এটি আমার জন্য অনেক সময় সাশ্রয় করবে ।


1
আপনি কোনও পদ্ধতি তৈরি / পরিবর্তন করার আগে কেবল সমস্ত স্কিমা পরিবর্তনগুলি প্রক্রিয়া করতে পারবেন না? টেবিলটি সঠিক হওয়ার আগে কেন প্রক্রিয়া উপস্থিত থাকতে হবে?
অ্যারন বারট্রান্ড

আমি এখন কোডে এই বিকল্পটি অনুসরণ করছি। এসকিউএল যেভাবে উত্পন্ন হয় তা মোটামুটি জটিল (এটি একটি সহজ উদাহরণ ছিল) তবে দেখে মনে হচ্ছে এটি পিআইটিএর মতো হবে না যা আমি ভেবেছিলাম।
ড্যানিয়েল জেমস ব্রায়ার্স

2
আপনি অবশ্যই আপনার সঞ্চিত পদ্ধতিগুলি গতিশীল এসকিউএল-এ পূর্ণ করে স্টাফ করে তা পেতে পারেন - তবে আমি স্ক্রিমা পরিবর্তনগুলি পরিচালনা করতে আপনার স্ক্রিপ্ট তৈরির কথা ভাবতে পারি না তবে সঞ্চিত পদ্ধতিগুলি এতটা কঠিন হবে। পিছিয়ে দেওয়া নাম রেজ্যুলেশন কীভাবে কাজ করে তা নির্ধারণ করার জন্য খুব বেশি বিকল্প নেই। আমি জানি যে বইগুলি সম্পর্কে আমি জানি, বা কমপক্ষে যে আমি তাদের বিনোদন দিতে আগ্রহী তা নির্ধারণ করতে পারি, এটি অন্যভাবে - এটি আরও কঠোর করে তোলা - sommarskog.se/strict_checks.html দেখুন )।
অ্যারন বারট্রান্ড

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

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

উত্তর:


6

না।

আমি কেবল টাইপ করে সত্যিই নিজেকে দোষী মনে করি, তবে না, দুঃখের বিষয়। আমি এই ব্যবহারের ঘটনাটি প্রথম শুনেছি এবং এটি সঠিক ধারণা দেয়। এটির জন্য একটি অনুরোধ জমা দেওয়ার সেরা http://connect.microsoft.com এ এবং আপনার নাতি-নাতনিরা এটি করতে সক্ষম হবেন। ;-)


5

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

এমনকি #deferResolutionক্যোয়ারী অপ্টিমাইজার যেভাবে WHERE NOT EXISTSসর্বদা সত্যকে মূল্যায়ন করে তা প্রমাণ করার জন্য পদ্ধতিতে প্রতিটি বিবৃতিটির জন্য আপনি একই কার্যকরকরণ পরিকল্পনা ( টেবিলের কোনও রেফারেন্স নেই ) পাবেন।

যা কিছু বলেছিল, এটি বেশিরভাগ বৌদ্ধিক স্বার্থের জন্য উপস্থাপিত একটি ভয়ঙ্কর হ্যাক এবং এটি ভেঙে যাওয়ার একটি প্রান্তের ঘটনাও ঘটতে পারে। হারুন যেমন উল্লেখ করেছেন, সম্ভবত আপনার যথাযথ ক্রমে আপনার সমস্ত স্কিমা পরিবর্তন করে নেওয়া ভাল।

--Say this table already exists.
CREATE TABLE myTable
(
    a NVARCHAR(MAX)
)
GO

--My C# code creates something like this
BEGIN TRAN 
GO

--the sproc gets generated first.
CREATE PROCEDURE mySproc
AS
BEGIN
    CREATE TABLE #deferResolution (dummy INT NOT NULL)
    SELECT a,b FROM myTable WHERE NOT EXISTS (SELECT * FROM #deferResolution WHERE 0=1)
END

--then the table update
ALTER TABLE myTable
    ADD b nvarchar(MAX)

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