2008-09-29 11 views
16

में कॉलिंग संग्रहीत प्रक्रिया का पता लगाएं क्या यह पता लगाना संभव है कि स्टोर प्रक्रिया किसने कहा?SQL सर्वर

उदाहरण के लिए, मुझे proc3 में कोई त्रुटि मिलती है। उस proc के भीतर से मैं जानना चाहता हूं कि इसे proc1 या proc2 द्वारा कॉल किया गया था या नहीं।

+6

आप ओबीजेईपी (@@ प्रोसीआईडी) प्राप्त करके वर्तमान एसपी का नाम जान सकते हैं। – Gman

उत्तर

8

स्रोत निर्दिष्ट करने के लिए मैं एक अतिरिक्त इनपुट पैरामीटर का उपयोग करूंगा, यदि यह आपके तर्क के लिए महत्वपूर्ण है।

इससे आपके डेटाबेस को किसी अन्य प्लेटफ़ॉर्म पर पोर्ट करना आसान हो जाएगा, क्योंकि आप कुछ अस्पष्ट प्लेटफ़ॉर्म आश्रित फ़ंक्शन पर निर्भर नहीं हैं।

3

क्या आपको रनटाइम पर proc3 में जानने की आवश्यकता है जिसके कारण त्रुटि हुई है, या आपको डिबगिंग के दौरान बस जानने की आवश्यकता है?

यदि आप डिबगिंग/निगरानी के दौरान केवल इसे करने की आवश्यकता है तो आप SQL Server profiler का उपयोग कर सकते हैं।

अन्यथा 2005 में मुझे विश्वास नहीं है कि आपके पास ट्रेस स्टैक करने की क्षमता है।

इसके आसपास काम करने के लिए आप proc3, @CallingProc या उस तरह कुछ ऐसा जोड़ सकते हैं और अतिरिक्त पैरामीटर जोड़ सकते हैं।

या आप proc1 और proc2 में कैच ब्लॉक को जोड़ सकते हैं।

BEGIN TRY 
EXEC Proc3 
END TRY 
BEGIN CATCH 
SELECT 'Error Caught' 
SELECT 
    ERROR_PROCEDURE() 
END CATCH 

अच्छा यहाँ संदर्भ: http://searchsqlserver.techtarget.com/tip/1,289483,sid87_gci1189087,00.html

और निश्चित रूप से हमेशा SQL Server Books Online

एसक्यूएल सर्वर 2008 हालांकि प्रक्रियाओं के माध्यम से डिबग करने की क्षमता है।

2

आप proc1 और proc2 पैरामीटर के रूप में proc3 में अपने नाम पास कर सकते हैं।

उदाहरण के लिए:

CREATE PROCEDURE proc3 
    @Caller nvarchar(128) -- Name of calling proc. 
    AS 
    BEGIN 
    -- Produce error message that includes caller's name. 
    RAISERROR ('Caller was %s.', 16,10, @Caller); 
    END 
    GO 

    CREATE PROCEDURE proc1 
    AS 
    BEGIN 
    -- Get the name of this proc. 
    DECLARE @ProcName nvarchar(128); 
    SET @ProcName = OBJECT_NAME(@@PROCID); 
    -- Pass it to proc3. 
    EXEC proc3 @ProcName 
    END 
    GO 

    CREATE PROCEDURE proc2 
    AS 
    BEGIN 
    -- Get the name of this proc. 
    DECLARE @ProcName nvarchar(128); 
    SET @ProcName = OBJECT_NAME(@@PROCID); 
    -- Pass it to proc3. 
    EXEC proc3 @ProcName 
    END 
    GO 
3

यह करने के लिए (अफसोस) कोई अच्छा स्वचालित तरीका नहीं है। तो यह वास्तव में इस पर निर्भर करता है कि ऐसा करने में सक्षम होने के लिए आप अपनी procs लिखने के लिए तैयार हैं (पुनः)।

यदि आपके पास लॉगिंग तंत्र है, तो आप लॉग को पढ़ने और काम करने में सक्षम हो सकते हैं जो आपको बुलाता है।

उदाहरण के लिए, यदि आप एक मेज पर डालने, उदाहरण के लिए द्वारा प्रवेश को लागू करता है, तो:

CREATE TABLE Log 
(timestamp dattime, 
spid  int, 
procname varchar(255), 
message varchar(255)) 

... text of proc ... 
INSERT INTO Log 
SELECT get_date(), @@spid, @currentproc, 'doing something' 
-- you have to define @currentproc in each proc 

-- get name of caller 
SELECT @caller = procname 
FROM Log 
WHERE spid = @@spid 
AND timestamp = (SELECT max(timestamp) 
        FROM Log 
        WHERE timestamp < get_date() 
        AND procname != @currentproc) 

यह पुनरावर्ती कॉल के लिए काम नहीं होगा, लेकिन शायद किसी को उस ठीक कर सकते हैं?