आप DB_ID()
. का उपयोग करके देख सकते हैं , मेरा मानना है कि DB_ID()
हमेशा 1-4 होता है (जब तक कि आपके पास वितरण डेटाबेस
न हो ) सिद्धांत रूप में, बस यह देखने के लिए जांचें कि क्या DB_ID() 4 से बड़ा है:
exec sp_MSforeachdb 'IF DB_ID(''?'')) > 4
BEGIN
DELETE FROM [?].schema.sessions WHERE name like ''xyz_%''
AND sessionStart <DATEADD(mi, -5,GETDATE())
END'
यह भी नहीं लगता है कि आप त्रुटि हैंडलर में सही डेटाबेस का उपयोग कर रहे हैं - निश्चित रूप से तालिका बनाने वाला आपका प्रयास पकड़ sp_MSforeachdb
पर कॉल में होना चाहिए साथ ही?
मेरा मतलब है कि आपके टेक्स्ट में आप प्रत्येक डीबी के लिए चल रहे हैं, इसमें एक कोशिश में यह भी शामिल है:
CREATE TABLE [?].[SCHEMA].[SESSIONS]
(
[authuser] [VARCHAR](30) NULL,
[sessionID] [CHAR](36) NULL,
[sessionStart] [DATETIME] NULL
)
एक और बात - इस समय ऐसा लगता है कि आपने reviewadmin.sessions
मान को हार्ड कोड किया है आपकी अनुमति देने वाले कोड में - मुझे लगता है कि आपका मतलब है कि आपका नया [?].[Schema].[Sessions]
तालिका - फिर से जो कॉल में होनी चाहिए sp_MSforeachdb
इसलिए यह जानता है कि किस डेटाबेस पर चलना है।
मुझे आशा है कि मैंने आपको आगे बढ़ने के लिए पर्याप्त दिया है, मैं ऐसी मशीन पर नहीं हूं जहां मैं पूरी बात लिख और परीक्षण कर सकूं, मुझे डर है!
यदि आप केवल xyz_%
. नाम के डेटाबेस चाहते हैं :
exec sp_MSforeachdb 'IF DB_NAME() LIKE ''xyz_%''
BEGIN
DELETE FROM [?].schema.sessions WHERE name like ''xyz_%''
AND sessionStart <DATEADD(mi, -5,GETDATE())
END'
ध्यान दें कि अब हम DB_ID> 4 के लिए चेक को छोड़ सकते हैं, क्योंकि कोई भी सिस्टम डेटाबेस वैसे भी आपके नामकरण परंपरा से मेल नहीं खाता।
ठीक है, मैंने इस पर फिर से विचार किया है। कोशिश करने और फिर विफल होने पर त्रुटि को पकड़ने के बजाय, इस नई योजना के बारे में कैसे:
- जांचें कि क्या डेटाबेस आपके इच्छित नामकरण परंपरा से मेल खाता है।
- जांचें कि क्या तालिका मौजूद है।
- यदि ऐसा नहीं है तो तालिका बनाएं, पहले की तरह अनुमति दें।
- सम्मिलित करें।
इसे उम्मीद से करना चाहिए:
EXEC Sp_msforeachdb 'IF ''?'' LIKE ''xyz_%''
BEGIN
IF OBJECT_ID(''?.REVIEWADMIN.Sessions'', ''U'') IS NULL
BEGIN
CREATE TABLE [?].ReviewAdmin.Sessions
(
[authuser] [VARCHAR](30) NULL,
[sessionID] [CHAR](36) NULL,
[sessionStart] [DATETIME] NULL
)
grant select,delete on reviewadmin.sessions to public;
END
DELETE FROM [?].ReviewAdmin.Sessions
WHERE sessionStart < DATEADD(mi, -5,GETDATE())
END'