यहां एक और दृष्टिकोण है, जो मुझे लगता है कि विशेष मामले के लिए उपयुक्त है जब किसी एप्लिकेशन द्वारा किसी एप्लिकेशन से सीधे प्रक्रिया को कॉल किया जाना है।
मुझे कहना होगा कि यह अधिकतर सुझावों के मुकाबले डेवलपर के लिए अधिक (शायद, असमान रूप से) उपयोगकर्ता के लिए कम परेशानी का प्रस्ताव है। आप तय करते हैं कि यह आपके लिए उपयुक्त है या नहीं।
वैसे भी, यहां जाता है।
सबसे पहले, आप महत्वपूर्ण प्रक्रियाओं पर कॉल पंजीकृत करने के लिए एक विशेष तालिका, CriticalCalls
बनाते हैं।
SPID int,
ProcName sysname,
CallTime datetime
असल में, यह विचार है कि एक महत्वपूर्ण सपा दो बार बुलाया जाना चाहिए है: पहले वह अपने कॉल पंजीकृत करता है और उपयोगकर्ता को सूचित के रूप में समय की एक निश्चित अंतराल के भीतर कॉल दोहराने की तालिका इस तरह की एक संरचना के लिए होता है उनके इरादे की पुष्टि, और दूसरी कॉल के साथ, यदि तदनुसार बनाया गया है, तो यह वास्तव में अपने कार्य को पूरा करने के साथ आगे बढ़ता है।
तो हर महत्वपूर्ण प्रक्रिया के शुरू हिस्सा इस तर्क होगा:
IF NOT EXISTS (
SELECT *
FROM CriticalCalls
WHERE SPID = @@SPID AND ProcName = @ThisProcName
AND GETDATE() - CallTime BETWEEN @LowerCallTimeLimit AND @UpperCallTimeLimit
/* the actual test for the time interval might be somewhat different */
) BEGIN
... /* upsert CriticalCalls with the current time stamp */
PRINT 'To proceed, please call this procedure again within...';
RETURN;
END;
DELETE FROM CriticalCalls WHERE SPID = @@SPID AND ProcName = @ThisProcName;
... /* proceed with your critical task */
वास्तव में, मुझे लगता है, यह सबसे अच्छा होगा CriticalCalls
के साथ सभी जोड़तोड़ के लिए एक समर्पित सपा (नीचे CheckCriticalCalls
नाम) का उपयोग करने के सहित, सभी आवश्यक संशोधन। CheckCriticalCalls
को जांचने की प्रक्रिया का नाम प्राप्त होगा और यह दिखाएगा कि निर्दिष्ट प्रक्रिया को अपना असली ऑपरेशन करना चाहिए या नहीं।
तो यह इस तरह नहीं बल्कि दिख सकता है:
EXECUTE @result = CheckCriticalCalls 'ThisProcedureName';
IF @result = -1 BEGIN
PRINT 'Call me again';
RETURN;
END;
... /* go on with the task */
अंतराल की निचली सीमा की स्थापना के पीछे विचार यह एक महत्वपूर्ण प्रक्रिया दो बार स्वचालित रूप से बुला, दो समान EXECUTE...
लाइनों को क्रियान्वित करते हुए IE से उपयोगकर्ता को रोकने के लिए केवल है एक बैच में ऊपरी सीमा, ज़ाहिर है, 1) यह सुनिश्चित करना है कि उपयोगकर्ता महत्वपूर्ण संचालन करने के लिए अपने हालिया इरादे की पुष्टि करता है; 2) निष्पादन को रोकें यदि CriticalCalls
में मौजूदा रिकॉर्ड वास्तव में एक ही एसपीआईडी के साथ पिछले सत्र से वहां छोड़ा गया है।
तो, मूल रूप से, 1-2 सेकंड से आधा मिनट का अंतराल मेरे लिए काफी प्राकृतिक प्रतीत होता है। आप इसके बजाय अलग-अलग आंकड़े चुन सकते हैं।
आप अपनी संग्रहीत प्रोसेस के लिए अनुमति क्यों सेट नहीं करते हैं? इस तरह, केवल अधिकृत उपयोगकर्ता ही इसे चला सकते हैं। –
@ द एलिट जेंटलमैन: मैं यह नहीं कह रहा हूं कि अधिकृत उपयोगकर्ता कभी-कभी मशीनों की बजाय मनुष्यों की तरह महसूस करना चाहेंगे। यह विशेष मामला दिखाता है कि कुछ डेवलपर्स उपयोगकर्ताओं को केवल प्राणियों के रूप में नहीं समझते हैं। :) –