2009-10-29 25 views
40

संग्रहित प्रक्रियाओं, विचारों, कार्यों इत्यादि बनाने की बात आती है, क्या यह एक ड्रॉप करना बेहतर है ... ऑब्जेक्ट पर बनाएं या बदलें?ड्रॉप ... बनाम बनाम

मैंने कई "मानक" दस्तावेज देखे हैं जो एक ड्रॉप करने के लिए कह रहे हैं ... बनाएं, लेकिन मैंने कई टिप्पणियों और तर्कों को ALTER विधि के लिए वकालत की है।

एल्टर विधि सुरक्षा को बरकरार रखती है, जबकि मैंने सुना है कि ड्रॉप ... विधि को पूरे एसपी पर पुन: संकलित करने के लिए पहली बार इसे एक कथन स्तर पुन: संकलित करने के बजाए निष्पादित किया जाता है।

क्या कोई मुझे बता सकता है कि दूसरे पर एक का उपयोग करने के अन्य फायदे/नुकसान हैं?

+0

प्रश्न का पालन करें: ड्रॉप है ... अभी भी परमाणु बनाओ? मुझे लगता है कि ALTER परमाणु है क्योंकि यह एक ही कथन है, लेकिन यह भी सत्यापित करने लायक है। – gzak

उत्तर

37

ALTER भी पूरे प्रक्रिया के एक recompile बाध्य करेगा। स्टेटमेंट लेवल रीकंपाइल प्रक्रियाओं के अंदर बयानों पर लागू होता है, उदाहरण के लिए। एक एकल चयन, जिसे पुन: संकलित किया जाता है क्योंकि अंतर्निहित तालिकाओं में परिवर्तन होता है, प्रक्रिया में कोई भी परिवर्तन होता है। को समझने के लिए, ALTER प्रक्रिया के बाद SQL पाठ में परिवर्तित को समझने के लिए, सर्वर को केवल इसे संकलित करना होगा ... ALTER प्रक्रिया पर केवल कुछ निश्चित विवरणों को चुनिंदा रूप से पुन: संकलित करना भी संभव नहीं होगा।

सभी ऑब्जेक्ट्स के लिए ALTER हमेशा बेहतर होता है क्योंकि यह सभी सुरक्षा, सभी विस्तारित गुणों, सभी निर्भरताओं और सभी बाधाओं को सुरक्षित रखता है।

+0

सही टाइपो: "स्टेटमेंट्स" से "कथन" –

+2

+1 प्रश्न में उठाए गए दो चिंताओं/बिंदुओं को संबोधित करता है। – NYSystemsAnalyst

8

परिवर्तन आमतौर पर बेहतर होता है। यदि आप ड्रॉप और बनाते हैं, तो आप उस ऑब्जेक्ट से जुड़े अनुमतियों को खो सकते हैं।

+0

गैर! RECOMPILE के साथ एसक्यूएल सर्वर को स्पोक के ** प्रत्येक निष्पादन ** पर क्वेरी प्लान फेंकने के लिए कहता है। जब स्पोक आगे चलाया जाता है तो सभी ALTERS का पुनर्मूल्यांकन होता है। – Andomar

+0

एंडोमर की रक्षा में, मैंने टिप्पणी करने के बाद जवाब बदल दिया। वह लिखता है, और मैं सवाल के एक अलग हिस्से का जवाब दे रहा था और मेरा जवाब अस्पष्ट था। – kemiller2002

0

आपने विशेष रूप से डीबी ऑब्जेक्ट्स से संबंधित एक प्रश्न पूछा है जिसमें कोई डेटा नहीं है, और सैद्धांतिक रूप से इसे अक्सर नहीं बदला जाना चाहिए।

इसकी संभावना है कि आपको इन ऑब्जेक्ट्स को संपादित करने की आवश्यकता हो लेकिन हर 5 मिनट में नहीं। इस वजह से मुझे लगता है कि आप पहले ही सिर पर हथौड़ा मार चुके हैं - अनुमतियां।

कम जवाब है, नहीं वास्तव में एक मुद्दा है, जब तक कि अनुमतियों कोई समस्या नहीं होगी

48

यह वह जगह है कि हम इसे कैसे करते हैं:

if object_id('YourSP') is null 
    exec ('create procedure dbo.YourSP as select 1') 
go 
alter procedure dbo.YourSP 
as 
... 

कोड एक "ठूंठ" बनाता प्रक्रिया संग्रहीत करता है, तो ऐसा नहीं अभी तक अस्तित्व में नहीं है, अन्यथा यह एक बदलाव करता है। इस तरह प्रक्रिया पर किसी मौजूदा अनुमति को संरक्षित किया जाता है, भले ही आप बार-बार स्क्रिप्ट निष्पादित करते हैं।

+1

+1 अच्छी चाल .. –

+4

बेहतर ऑब्जेक्ट_आईडी ('dbo.YourSP') करें अन्यथा आप एक तालिका को बदलना समाप्त कर सकते हैं जो किसी अन्य मालिक के अलावा मौजूद नहीं है – MartW

+8

बनाएं या ALTER SQL सर्वर के लिए वास्तव में अच्छा होगा .... ... –

-1

एक उपयोगिता बिंदु से एक बूंद और निर्माण एक बदलाव से बेहतर है। परिवर्तन उस डेटाबेस में विफल हो जाएगा जिसमें उस ऑब्जेक्ट को शामिल नहीं किया गया है, लेकिन यदि IF EXISTS DROP है और फिर CREATE डेटाबेस में पहले से अस्तित्व में या डेटाबेस में काम करेगा जहां ऑब्जेक्ट मौजूद नहीं है। ओरेकल और पोस्टग्रेएसक्यूएल में आप सामान्य रूप से कथन के साथ फ़ंक्शंस और प्रक्रियाएं बनाते हैं या प्रतिलिपि बनाते हैं जो एक SQL सर्वर के रूप में समान होता है यदि EXPSTS DROP और फिर CREATE। यह अच्छा होगा अगर SQL सर्वर ने इस छोटे लेकिन बहुत आसान वाक्यविन्यास को उठाया।

इस तरह मैं इसे करूँगा। किसी दिए गए ऑब्जेक्ट के लिए इसे एक स्क्रिप्ट में रखें।

IF EXISTS (SELECT 1 
      FROM information_schema.routines 
      WHERE routine_schema = 'dbo' 
       AND routine_name = '<PROCNAME' 
       AND routine_type = 'PROCEDURE') 
BEGIN 
    DROP PROCEDURE <PROCNAME> 
END 
GO 


CREATE PROCEDURE <PROCNAME> 
AS 
BEGIN 
END 
GO 

GRANT EXECUTE ON <PROCNAME> TO <ROLE> 
GO 
+0

क्या आप कृपया -1 की व्याख्या कर सकते हैं? मुझे उत्सुकता है कि यह मूल्य का नहीं है? – Kuberchaun

+1

मुझे लगता है कि आपको -1 मिल गया है क्योंकि आपका कथन एक अलग प्रश्न में अस्वीकार कर दिया गया था। असल में कोई आपसे असहमत था। – jcollum

1

यदि आपके पास एक फ़ंक्शन/संग्रहीत प्रो है जिसे उदाहरण के लिए वेबसाइट से अक्सर कहा जाता है, तो इससे समस्याएं पैदा हो सकती हैं।

संग्रहीत प्रो कुछ मिलीसेकंड/सेकेंड के लिए छोड़ा जाएगा, और उस समय के दौरान, सभी प्रश्न विफल हो जाएंगे।

आप एक को बदलते हैं, तो आप इस समस्या नहीं है।

IF EXISTS (SELECT * FROM sysobjects WHERE type = 'P' AND name = '<name>') 
    BEGIN 
     DROP PROCEDURE <name> 
    END 
GO 

CREATE PROCEDURE <name> 
...... 

हालांकि, विपरीत बेहतर है, imo:

नव निर्मित संग्रहीत proc के लिए टेम्पलेट्स आम तौर पर इस रूप है

storedproc/समारोह/आदि मौजूद नहीं है, इसे बनाने के एक डमी चयन कथन के साथ। फिर, परिवर्तन हमेशा काम करेगा - इसे कभी नहीं छोड़ा जाएगा।

हम तो हमारे संग्रहीत procs/कार्य आमतौर पर इस तरह है कि के लिए एक संग्रहीत proc है,:

EXEC Utils.pAssureExistance 'Schema.pStoredProc' 
GO 

ALTER PROCECURE Schema.pStoredProc 
... 

और हम कार्यों के लिए एक ही संग्रहीत proc का उपयोग करें:

EXEC Utils.pAssureExistance 'Schema.fFunction' 
GO 

ALTER FUNCTION Schema.fFunction 
... 

Utils.pAssureExistance में हम एक आईएफ करते हैं और "।" के बाद पहले अक्षर को देखते हैं: यदि यह "एफ" है, तो हम एक डमी फॉनक्शन बनाते हैं, अगर यह "पी" है, तो हम एक डमी संग्रहित प्रो बनाते हैं।

हालांकि सावधान रहो, अगर आप एक डमी अदिश समारोह बनाने के लिए, और अपने ALTER एक मेज-मान समारोह पर है, ALTER फंक्शन असफल हो जायेगी हुए कहा कि यह संगत नहीं है।

फिर, Utils.pAssureExistance, सुविधाजनक हो सकता है, एक अतिरिक्त वैकल्पिक पैरामीटर

EXEC Utils.pAssureExistance 'Schema.fFunction', 'TableValuedFunction' 

एक डमी तालिका-मान समारोह पैदा करेगा साथ

Additionaly, मैं गलत हो सकता है, लेकिन मैं अगर आपको लगता है एक ड्रॉप प्रक्रिया करें और एक क्वेरी वर्तमान में संग्रहीत प्रो का उपयोग कर रही है, यह असफल हो जाएगी।

हालांकि, एक बदलने की प्रक्रिया सभी प्रश्नों के लिए प्रतीक्षा संग्रहीत proc का उपयोग बंद करने, और फिर यह बदल देते हैं। यदि प्रश्न संग्रहित प्रो को बहुत लंबे समय तक लॉक कर रहे हैं (कुछ सेकंड कहें), तो ALTER लॉक के लिए प्रतीक्षा करना बंद कर देगा, और संग्रहीत प्रो को वैसे भी बदल देगा: संग्रहीत प्रो का उपयोग करने वाले प्रश्न शायद उस बिंदु पर असफल हो जाएंगे।

+0

क्यों sysobjects (जिसे बहिष्कृत किया गया है) का उपयोग करने के बजाय "sys.procedures" में चेक न करें और टाइप निर्दिष्ट करने के लिए क्यों ?? –

+0

"sysobjects" को SQL Server 2008 के रूप में बहिष्कृत किया गया है: http://msdn.microsoft.com/en-us/library/ms143729.aspx –

+0

अच्छी तरह से ... मैंने SQL Server 2008 से टेम्पलेट का उपयोग करके संग्रहित प्रो बनाई है, और इसे कॉपी-पेस्ट किया गया। माइक्रोसॉफ्ट को अपने दिशानिर्देशों का पालन करना चाहिए मुझे लगता है! – Kevin

0

DROP आम तौर पर अनुमति और किसी भी विस्तारित गुण खो देता है।

कुछ यूडीएफ पर, ALTER भी विस्तारित गुणों को खो देगा (निश्चित रूप से SQL सर्वर 2005 बहु-कथन तालिका-मूल्यवान फ़ंक्शंस पर)।

मैं आम तौर पर नहीं DROP और CREATE जब तक कि मैं भी उन चीजों पुनः कर रहा हूँ कर (या जानता हूँ कि मैं उन्हें कम करना चाहते)।

0

हम विकास में काम करते समय बदलते थे या तो नई कार्यक्षमता बनाते थे या कार्यक्षमता को संशोधित करते थे। जब हम अपने विकास और परीक्षण के साथ किए गए तो हम एक बूंद और निर्माण करेंगे। यह procs पर तारीख/समय टिकट मुद्रित करता है ताकि आप उन्हें दिनांक/समय के अनुसार क्रमबद्ध कर सकें।

यह भी देखने के लिए क्या प्रत्येक प्रदेय हम बाहर भेजा के लिए तिथि के अनुसार bundeled था हमें की अनुमति दी।

1

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

मैंने हमेशा ड्रॉप/रीवेटेट का उपयोग करना पसंद किया है। मुझे उन्हें स्रोत नियंत्रण में स्टोर करना भी आसान लगता है। करने के बजाय .... यदि मौजूद है तो परिवर्तन करें और यदि अस्तित्व में नहीं है तो बनाओ।

इसके साथ ... यदि आप जानते हैं कि आप क्या कर रहे हैं ... मुझे नहीं लगता कि यह बहुत मायने रखता है।

0

यदि मौजूद है तो ड्रॉप के साथ जोड़ें बेहतर है क्योंकि यदि आपके पास स्क्रिप्ट को क्यूए या टेस्ट या प्रोड पर ले जाने पर कई वातावरण हैं तो आप नहीं जानते कि स्क्रिप्ट पहले से ही उस वातावरण में मौजूद है या नहीं। एक बूंद जोड़कर (यदि यह पहले से मौजूद है) और फिर जोड़ दें तो यह कवर किया जाएगा चाहे वह मौजूद है या नहीं। इसके बाद आपको अनुमतियों को दोबारा लागू करना होगा, लेकिन इसके बाद आपकी स्थापना स्क्रिप्ट त्रुटि-बाहर सुनना बेहतर होगा।

0

SQL सर्वर 2016 SP1 से शुरू होने पर, अब आपके पास संग्रहित प्रक्रियाओं, कार्यों, ट्रिगर्स और विचारों के लिए CREATE OR ALTER वाक्यविन्यास का उपयोग करने का विकल्प है। SQL सर्वर डेटाबेस इंजन ब्लॉग पर CREATE OR ALTER – another great language enhancement in SQL Server 2016 SP1 देखें। उदाहरण के लिए:

CREATE OR ALTER PROCEDURE dbo.MyProc 
AS 
BEGIN 
    SELECT * FROM dbo.MyTable 
END; 
संबंधित मुद्दे