Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

संग्रहीत प्रोसेस को पुन:संकलित करें?

मैं आपके प्रश्न को 'जब मैं एक स्कीमा परिवर्तन करता हूं, तो मैं उन सभी प्रक्रियाओं को मान्य करना चाहता हूं जो वे अभी भी नई स्कीमा के साथ सही ढंग से निष्पादित करते हैं'। अर्थात। यदि आप किसी प्रक्रिया में एक चयन में संदर्भित कॉलम छोड़ते हैं, तो आप इसे फ़्लैग करना चाहते हैं क्योंकि इसमें परिवर्तन की आवश्यकता होती है। इसलिए विशेष रूप से मैं आपके प्रश्न को 'मैं अगले निष्पादन पर पुन:संकलित करने की प्रक्रिया चाहता हूं' के रूप में नहीं समझता, क्योंकि इंजन द्वारा आपके लिए उस नौकरी का ख्याल रखा जाता है, जो किसी भी स्कीमा परिवर्तन से जुड़े मेटाडेटा संस्करण परिवर्तन का पता लगाएगा और मौजूदा को त्याग देगा कैश्ड निष्पादन योजनाएँ।

मेरा पहला अवलोकन यह है कि आप अपने प्रश्न में जो वर्णन करते हैं वह आमतौर पर परीक्षा . का काम होता है और आपके पास अपनी परिनियोजन प्रक्रिया में एक क्यूए चरण होना चाहिए जो नए 'बिल्ड' को मान्य करता है। आपके पास सबसे अच्छा समाधान यूनिट परीक्षणों का एक न्यूनतम सेट लागू करना है, जो कम से कम, आपकी सभी संग्रहीत प्रक्रियाओं के माध्यम से पुनरावृत्त करता है और निष्पादन को मान्य करता है एक परीक्षण परिनियोजन में शुद्धता के लिए प्रत्येक का। यह सभी आश्चर्यों को काफी हद तक समाप्त कर देगा, कम से कम उन्हें समाप्त कर देगा जहां यह दर्द होता है (उत्पादन में, या ग्राहक साइट पर)।

आपका अगला सबसे अच्छा विकल्प इन निर्भरताओं को ट्रैक करने के लिए अपने विकास उपकरणों पर भरोसा करना है। विजुअल स्टूडियो डेटाबेस 2008 डेटाबेस संस्करण ऐसी कार्यक्षमता प्रदान करता है और यह आपके द्वारा स्कीमा में किए गए किसी भी परिवर्तन को मान्य करने का ध्यान रखेगा।

और अंत में आपका अंतिम विकल्प कुछ ऐसा करना है जैसा कि केएम ने सुझाया था:संशोधित वस्तु के आधार पर अपनी सभी प्रक्रियाओं के माध्यम से एक पुनरावृत्ति को स्वचालित करें (और निर्भर लोगों के आधार पर सभी प्रक्रियाएं और इसी तरह और आगे और आगे)। यह पुनर्संकलन के लिए प्रक्रियाओं को चिह्नित करने के लिए पर्याप्त नहीं होगा, आपको वास्तव में इसकी आवश्यकता है कि इसके टेक्स्ट को पार्स करने और स्कीमा के सत्यापन के लिए ALTER PROCEDURE को चलाने के लिए (चीजें टी-एसक्यूएल बनाम आपकी सामान्य भाषा में थोड़ी अलग हैं) संकलित/निष्पादित चक्र, 'संकलन' प्रति से केवल तब होता है जब प्रक्रिया वास्तव में निष्पादित होती है)। आप sys.sql_dependencies अपनी बदली हुई वस्तु की सभी निर्भरताओं को खोजने के लिए, और sys.sql_modules :

with cte_dep as (
   select object_id
      from sys.sql_dependencies
    where referenced_major_id = object_id('<your altered object name>') 
    union all
    select d.object_id
    from sys.sql_dependencies d
        join cte_dep r on d.referenced_major_id = r.object_id
    )
, cte_distinct as (
    select distinct object_id
        from cte_dep)
select object_name(c.object_id)
    , c.object_id 
    , m.definition
    from cte_distinct c
    join sys.sql_modules m on c.object_id = m.object_id

फिर आप निर्भर 'मॉड्यूल' के माध्यम से चला सकते हैं और उन्हें फिर से बना सकते हैं (यानी उन्हें छोड़ दें और 'परिभाषा' में कोड चलाएं)। ध्यान दें कि एक 'मॉड्यूल' एक संग्रहीत प्रक्रिया की तुलना में अधिक सामान्य है और इसमें दृश्य, ट्रिगर, फ़ंक्शन, नियम, डिफ़ॉल्ट और प्रतिकृति फ़िल्टर भी शामिल हैं। एन्क्रिप्ट किए गए 'मॉड्यूल' में परिभाषा उपलब्ध नहीं होगी और पूरी तरह से सही होने के लिए आपको sys.sql_modules में कैप्चर की गई विभिन्न सेटिंग्स का भी हिसाब रखना होगा। (एएनएसआई नल, स्कीमा बाइंडिंग, क्लॉज आदि के रूप में निष्पादित)।

यदि आप ynamic SQL का उपयोग करते हैं, तो इसे सत्यापित नहीं किया जा सकता है। इसे sys.sql_dependencies . द्वारा कैप्चर नहीं किया जाएगा , और न ही इसे मॉड्यूल को 'पुनः बनाने' द्वारा मान्य किया जाएगा।

कुल मिलाकर मुझे लगता है कि आपका सबसे अच्छा विकल्प, बड़े अंतर से, इकाई परीक्षण सत्यापन को लागू करना है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर में ऑडिट टेबल लागू करने के लिए सुझाव?

  2. कुल गिनती और सबसेट की गिनती पाने का सबसे आसान तरीका?

  3. SQL सर्वर में स्वचालित योजना सुधार

  4. सर्वर पर MSDTC 'सर्वर अनुपलब्ध है'

  5. Sql सर्वर अस्थायी तालिका गायब हो जाती है