5

मैं संग्रहीत प्रक्रिया को ट्रिगर से कॉल करना चाहता हूं, x मिनट के बाद संग्रहीत प्रक्रिया को निष्पादित करने के लिए कैसे करें? पंक्तियों भी इंगित करना चाहिए जब संग्रहीत प्रक्रिया के अपने रन होने चाहिए - मैं से WAITFOR DELAYएक समय विलंब के बाद एक ट्रिगर से संग्रहीत प्रक्रिया निष्पादित करें

धन्यवाद

उत्तर

9

अन्य कुछ के लिए देख रहा हूँ एक SQL एजेंट काम नियमित रूप से चलने और एक मेज से प्रक्रिया मापदंडों संग्रहीत खींचती है , इसलिए एसक्यूएल एजेंट नौकरी केवल उन पंक्तियों को उठाएगी जो देय/थोड़ी अतिदेय हैं। संग्रहीत प्रक्रिया को कॉल करने के बाद इसे पंक्तियों को हटा देना चाहिए या उन्हें चिह्नित करना चाहिए।

फिर, ट्रिगर में, बस उसी तालिका में एक नई पंक्ति डालें।

आप किसी ट्रिगर में कुछ भी डालना नहीं चाहते हैं जो किसी भी तरह से मूल लेनदेन के निष्पादन को प्रभावित करेगा - आप निश्चित रूप से किसी भी देरी का कारण नहीं बनना चाहते हैं, या इसके बाहर किसी भी चीज़ से बातचीत नहीं करना चाहते हैं डेटाबेस।


जैसे, अगर संग्रहीत प्रक्रिया

CREATE PROCEDURE DoMagic 
    @Name varchar(20), 
    @Thing int 
AS 
    ... 

फिर हम एक तालिका बनाने होता है:

CREATE TABLE MagicDue (
    MagicID int IDENTITY(1,1) not null, --May not be needed if other columns uniquely identify 
    Name varchar(20) not null, 
    Thing int not null, 
    DoMagicAt datetime not null 
) 

और एसक्यूएल एजेंट काम करना होगा:

WHILE EXISTS(SELECT * from MagicDue where DoMagicAt < CURRENT_TIMESTAMP) 
BEGIN 
    DECLARE @Name varchar(20) 
    DECLARE @Thing int 
    DECLARE @MagicID int 

    SELECT TOP 1 @Name = Name,@Thing = Thing,@MagicID = MagicID from MagicDue where DoMagicAt < CURRENT_TIMESTAMP 

    EXEC DoMagic @Name,@Thing 

    DELETE FROM MagicDue where MagicID = @MagicID 
END 

और ट्रिगर में बस होगा:

CREATE TRIGGER Xyz ON TabY after insert 
AS 
    /*Do stuff, maybe calculate some values, or just a direct insert?*/ 
    insert into MagicDue (Name,Thing,DoMagicAt) 
    select YName,YThing+1,DATEADD(minute,30,CURRENT_TIMESTAMP) from inserted 

आप एक संस्करण है कि एजेंट का समर्थन नहीं करता में चला रहे हैं, तो आप इसके नकली हो सकता है। क्या मैं पूर्व में की गई एक संग्रहीत प्रक्रिया है कि "गरीब मनुष्य एजेंट नौकरियों" शामिल है, की तरह कुछ बनाने के लिए है:

CREATE PROCEDURE DoBackgroundTask 
AS 

    WHILE 1=1 
    BEGIN 
     /* Add whatever SQL you would have put in an agent job here */ 

     WAITFOR DELAY '00:05:00' 
    END 

फिर master डेटाबेस में इस समय, एक दूसरे संग्रहीत प्रक्रिया बनाने के लिए, है, जो 30 सेकंड इंतजार कर रहा है और फिर पहली प्रक्रिया कॉल:

CREATE PROCEDURE BootstrapBackgroundTask 
AS 
    WAITFOR DELAY '00:00:30' 
    EXEC YourDB..DoBackgroundTask 

और फिर, एक स्टार्टअप प्रक्रिया के रूप में इस प्रक्रिया को चिह्नित करते हैं, sp_procoption का उपयोग कर:

EXEC sp_procoption N'BootstrapBackgroundTask', 'startup', 'on' 

और सेवा को पुनरारंभ करें - अब आपके पास लगातार चल रही क्वेरी होगी।

+0

क्षमा करें अगर एसक्यूएल-एक्सप्रेस टैग जोड़ना भूल जाते हैं। –

+1

@ मोहम्मद रबी - आपके टैगिंग के साथ कुछ गड़बड़ है - कोई SQL Server 2000 एक्सप्रेस नहीं है। एमएसडीई था, लेकिन पहला एक्सप्रेस संस्करण 2005 था। क्या आप कृपया सही कर सकते हैं? –

+0

मैं चाहता हूं कि यह एसक्यूएल-सर्वर 2000 और एसक्यूएल-सर्वर 2008 एक्सप्रेस –

1

मेरे पास ऐसी ही स्थिति थी जहां मैंने ट्रिगर के साथ तालिका में डाले गए रिकॉर्ड को संसाधित करने से पहले, मैं यह सुनिश्चित करना चाहता था कि रिलेशनल टेबल में सभी संबंधित संबंधित डेटा भी थे।

मेरा समाधान एक स्क्रैच तालिका बनाना था जो पहली तालिका में सम्मिलित ट्रिगर द्वारा पॉप्युलेट किया गया था।

स्क्रैच तालिका में एक अद्यतन ध्वज था, (डिफ़ॉल्ट रूप से 0 पर सेट किया गया था), और एक सम्मिलित get date() दिनांक फ़ील्ड, और मुख्य तालिका से प्रासंगिक पहचानकर्ता।

मैंने फिर स्क्रैच तालिका पर लूप करने के लिए एक निर्धारित प्रक्रिया बनाई और मैं प्रत्येक रिकॉर्ड के खिलाफ व्यक्तिगत रूप से प्रदर्शन करने के लिए जो भी प्रक्रिया करना चाहता था, और 'अद्यतन ध्वज' को अपडेट करना, क्योंकि प्रत्येक रिकॉर्ड संसाधित किया गया था।

लेकिन, यहाँ है जहां मैं एक सुबह सा चालाक था, खरोंच तालिका है कि एक update flag = 0 था में रिकॉर्ड की तलाश की प्रक्रिया पर पाश में, मैं भी AND datediff(mi, Updated_Date, getdate())> 5 की AND खंड जोड़ा गया। इसलिए रिकॉर्ड को वास्तव में 5 मिनट तक संसाधित नहीं किया जाएगा जब इसे स्क्रैच तालिका में डाला गया था।