আমি একটি টেবিলে একটি আপডেট আপডেট পেয়েছি যা একটি নির্দিষ্ট কলামের জন্য সুনির্দিষ্ট মান থেকে অন্য কোনও মানতে পরিবর্তিত হয়। এটি যখন ঘটে, তখন এটি কোনও একক আপডেটের বিবৃতি দিয়ে অন্য টেবিলের সাথে সম্পর্কিত কিছু ডেটা আপডেট করে।
ট্রিগারটি প্রথম কাজটি করে তা পরীক্ষা করে দেখা হয় যে কোনও আপডেট হওয়া সারি এই প্রশ্নের উত্তর থেকে কলামটির মান পরিবর্তন করেছে কিনা। এটি সহজেই অন্তর্ভুক্ত থেকে মুছে ফেলাতে যোগ দেয় এবং সেই কলামের মানের তুলনা করে। যদি কোনও কিছুই যোগ্য না হয় তবে তা তাড়াতাড়ি ব্যাকআপ হয়ে যায় তাই আপডেট আপডেটটি চালিত হয় না।
IF NOT EXISTS (
SELECT TOP 1 i.CUSTNMBR
FROM INSERTED i
INNER JOIN DELETED d
ON i.CUSTNMBR = d.CUSTNMBR
WHERE d.CUSTCLAS = 'Misc'
AND i.CUSTCLAS != 'Misc'
)
RETURN
এই ক্ষেত্রে, CUSTNMBR অন্তর্নিহিত সারণীর প্রাথমিক কী। যদি আমি এই টেবিলটিতে একটি বড় আপডেট করি (বলুন, 5000+ সারি), আমি বিবৃতি কলামটি স্পর্শ না করলেও এই বিবৃতিটি বয়সগুলি গ্রহণ করে। আমি প্রোফাইলারটিতে কয়েক মিনিটের জন্য এই বিবৃতিতে এটি স্টল দেখতে পারি।
ফাঁসির পরিকল্পনা উদ্ভট। এটি 3,714 মৃত্যুদণ্ড কার্যকর করা এবং million 18.5 মিলিয়ন আউটপুট সারি সহ একটি sertedোকানো স্ক্যান দেখায়। এটি CUSTCLAS কলামে একটি ফিল্টার দিয়ে চলে। এটি এটি (নেস্টেড লুপের মাধ্যমে) একটি মুছে ফেলা স্ক্যান (CUSTCLAS এ ফিল্টার করা) এর সাথে যোগ দেয়, যা কেবল একবার কার্যকর হয় এবং 5000 টি আউটপুট সারি রয়েছে।
আমি এখানে কী কারণে বোকামি করছি? মনে রাখবেন যে ট্রিগারটি অবশ্যই একাধিক সারি আপডেটগুলি সঠিকভাবে পরিচালনা করবে।
সম্পাদনা :
আমি এটিও এটির মতো লেখার চেষ্টা করেছি (যদি উপস্থিতি অপ্রীতিকর কিছু করে) তবে এটি এখনও ঠিক ততটাই ভয়ঙ্কর।
DECLARE @CUSTNMBR varchar(31)
SELECT TOP 1 @CUSTNMBR = i.CUSTNMBR
FROM INSERTED i
INNER JOIN DELETED d
ON i.CUSTNMBR = d.CUSTNMBR
WHERE d.CUSTCLAS = 'Misc'
AND i.CUSTCLAS != 'Misc'
IF @CUSTNMBR IS NULL
RETURN