कैसे पता लगाया जाए कि एक संग्रहीत प्रक्रिया पहले से मौजूद है


130

मुझे एक परिनियोजन स्क्रिप्ट लिखनी होगी जो काम करेगी यदि कोई संग्रहीत प्रक्रिया मौजूद है या मौजूद नहीं है। अर्थात यदि यह मौजूद है, तो मुझे इसे बदलने की आवश्यकता है, अन्यथा इसे बनाएं।

मैं इसे sql में कैसे कर सकता हूं।

मैं SQL Server 2005 का उपयोग कर रहा हूं


जवाबों:


160

यदि आप DROP करते हैं और प्रक्रिया बनाते हैं, तो आप सुरक्षा सेटिंग्स को ढीला कर देंगे। यह आपके DBA को नाराज़ कर सकता है या आपके आवेदन को पूरी तरह से तोड़ सकता है।

यदि मैं अभी तक मौजूद नहीं है तो मैं एक तुच्छ संग्रहित प्रक्रिया बना सकता हूं। उसके बाद, आप संग्रहीत प्रक्रिया को अपनी पसंद के अनुसार बदल सकते हैं।

IF object_id('YourSp') IS NULL
    EXEC ('create procedure dbo.YourSp as select 1')
GO
ALTER PROCEDURE dbo.YourSp
AS
...

इस तरह, सुरक्षा सेटिंग्स, टिप्पणियां और अन्य मेटा deta तैनाती से बच जाएंगे।


2
कम से कम यदि आप इसे छोड़ देते हैं, तो आपको पता है कि आपको अनुमतियों को फिर से जोड़ना होगा। यदि आप इस sql को चलाते हैं तो आपको नहीं पता होगा कि स्प्रो के पास सही अनुमतियां हैं या नहीं, क्योंकि आपको नहीं पता होगा कि आपने इसे बनाया था या इसे बदल दिया था।
लियाज़ी

@ आसान समाधान वहाँ if object_id('YourSp') is null BEGIN ... ENDसंग्रहीत प्रक्रिया बनाने के बाद उचित अनुमति जोड़ने के लिए कोड जोड़ने के लिए है।
बजे

4
लगता है कि अन्य उत्तर थोड़ा और पूर्ण है क्योंकि यह केवल संग्रहीत प्रक्रियाओं के लिए ऑब्जेक्ट आईडी को खींचता है। अलग-अलग प्रकारों के लिए समान नाम होना आम नहीं है, लेकिन ऐसा हो सकता है
वर्कबाइट

149

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

IF OBJECT_ID('MySproc', 'P') IS NOT NULL
DROP PROC MySproc
GO

CREATE PROC MySproc
AS
BEGIN
    ...
END

1
यह काम करेगा, लेकिन यह संग्रहीत प्रक्रिया पर लागू किसी भी सुरक्षा परिवर्तन को हटा देता है।
एंडोमर

18
सुरक्षा परिवर्तन स्क्रिप्ट का भी हिस्सा होना चाहिए। इस तरह, यह ठीक से प्रलेखित हो जाएगा। यह सही तरीका है।
विगिन

@EnderWiggin सिवाय इसके कि अगर सुरक्षा कार्यान्वयन डिजाइन समय पर पता नहीं है ... क्या होगा यदि डेवलपर को यह नहीं पता है कि उपयोगकर्ताओं को कौन से अधिकारों का निष्पादन करने की आवश्यकता है?
एड्रियन डावेल

2
@ AdriaanDavel l कि DBA के लिए क्या हैं, और डेवलपर्स से बात करने के लिए DBA प्राप्त करना प्रबंधन कहलाता है। अगर डेवलपर्स और डीबीए एक साथ काम नहीं कर सकते हैं तो कंपनी के साथ समस्या है। इसके अलावा, ठीक से लागू की गई प्रणालियाँ किसी डेटाबेस को छूने के लिए उपयोगकर्ता के विशेषाधिकार पर निर्भर नहीं होती हैं, यही सेवा खाते के लिए हैं, और सेवा स्तर की सुरक्षा को डेटाबेस-वाइड लागू होना चाहिए, इस तरह से डीबीए को समय और धन की सुरक्षा पर खर्च नहीं करना पड़ता है व्यक्तिगत स्थान।
शॉन विल्सन

2
मेरे पास डेवलपर्स नहीं हैं जो एक व्यावसायिक उत्पाद से संबंधित स्प्रोक्स को छोड़ते / फिर से बनाते हैं। इसके बारे में सोचने के लिए आइए, मैं डीबीए ऐसा नहीं कर रहा हूं। मैं देख रहा हूं कि आपको क्या मिल रहा है, हालांकि, "क्या होगा यदि डीबीए को एक कॉमोरिकल उत्पाद के लिए एक स्पोक पोस्ट-तैनाती पर सुरक्षा को मोड़ने की आवश्यकता है"। मैं दोहराता हूं कि ठीक से लागू सिस्टम उपयोगकर्ता के विशेषाधिकार पर भरोसा नहीं करता है और उस सेवा-स्तर की सुरक्षा को डेटाबेस-वाइड लागू किया जाना चाहिए। मैंने DBAs के साथ काम किया है जो एक डेमो / स्क्रैच सिस्टम में स्थापित होगा और फिर एक स्कीमा सुनिश्चित करने के लिए एक अपग्रेड सुरक्षित होने के लिए तुलना करता है, IMO यह वही है जो वे काम पर रखने के लिए किराए पर लेते हैं।
शॉन विल्सन

31

यदि आप केवल संग्रहीत प्रक्रियाओं के साथ काम कर रहे हैं, तो सबसे आसान बात यह है कि संभवतः खरीद को छोड़ दें, फिर इसे फिर से बनाएं। SQL सर्वर में Generate Scripts विज़ार्ड का उपयोग करके ऐसा करने के लिए आप सभी कोड उत्पन्न कर सकते हैं।

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[YourSproc]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[YourSproc]

CREATE PROCEDURE YourSproc...

20

से SQL Server 2016 CTP3आप नए उपयोग कर सकते हैं DIE बड़ा बजाय बयान IFरैपर

वाक्य - विन्यास:

DROP {PROC | प्रक्रिया} [IF EXISTS] {[स्कीमा_नाम। ] प्रक्रिया} [, ... एन]

प्रश्न:

DROP PROCEDURE IF EXISTS usp_name

अधिक जानकारी यहाँ


11
if not exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[xxx]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
BEGIN
CREATE PROCEDURE dbo.xxx

खरीद xxxनाम कहां है


4

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


दिलचस्प! जब से आपने यह उत्तर पोस्ट किया है, तब से पाँच वर्षों में, आपके डेटाबेस संस्करण नियंत्रण विधियों में और अधिक विकास हुआ है?
थॉमस एल होलडे

4

आप एक क्वेरी इस प्रकार लिख सकते हैं:

IF OBJECT_ID('ProcedureName','P') IS NOT NULL
    DROP PROC ProcedureName
GO

CREATE PROCEDURE [dbo].[ProcedureName]
...your query here....

उपरोक्त सिंटैक्स पर अधिक विशिष्ट होना:
OBJECT_ID डेटाबेस के भीतर किसी ऑब्जेक्ट के लिए एक अद्वितीय आईडी नंबर है, यह SQL सर्वर द्वारा आंतरिक रूप से उपयोग किया जाता है। जब से हम ProcedureName से गुजर रहे हैं, तो आप ऑब्जेक्ट प्रकार P, जो SQL सर्वर को बताते हैं कि आपको ProcedureName नामक वस्तु मिलनी चाहिए, जो कि टाइप प्रक्रिया अर्थात P की है।

यह क्वेरी प्रक्रिया को खोज लेगी और यदि यह उपलब्ध है तो इसे छोड़ देगी और नया बनाएगी।

OBJECT_ID और ऑब्जेक्ट प्रकारों के बारे में विस्तृत जानकारी के लिए कृपया देखें: SYS.Objects



0

मेरे पास एक संग्रहित खरीद है जो ग्राहक को सत्यापन का विस्तार करने की अनुमति देती है, अगर यह मौजूद है तो मैं इसे बदलना नहीं चाहता हूं, अगर यह नहीं है कि मैं इसे बनाना चाहता हूं, तो सबसे अच्छा तरीका जो मैंने पाया है:

IF OBJECT_ID('ValidateRequestPost') IS NULL
BEGIN
    EXEC ('CREATE PROCEDURE ValidateRequestPost 
    @RequestNo VARCHAR(30),
    @ErrorStates VARCHAR(255) OUTPUT
AS
BEGIN
    SELECT @ErrorStates = @ErrorStates
END')
END

2
मैंने डाउन-वोट प्रदान नहीं किया था, लेकिन, एक अनुमान के अनुसार, मैं कहूंगा कि यह डाउन-वोट किया गया था क्योंकि यह समाधान संग्रहित प्रक्रिया के शरीर के भीतर उद्धरण पात्रों से बचने के साथ नई जटिलताओं का परिचय देता है।
डोपरक

0

नीचे दिए गए कोड की जांच होगी कि संग्रहीत प्रक्रिया पहले से मौजूद है या नहीं।

यदि यह मौजूद है तो यह बदल जाएगा, यदि यह मौजूद नहीं है तो यह आपके लिए एक नई संग्रहीत प्रक्रिया बनाएगा:

//syntax for Create and Alter Proc 
DECLARE @Create NVARCHAR(200) = 'Create PROCEDURE sp_cp_test'; 
DECLARE @Alter NVARCHAR(200) ='Alter PROCEDURE sp_cp_test'; 
//Actual Procedure 
DECLARE @Proc NVARCHAR(200)= ' AS BEGIN select ''sh'' END'; 
//Checking For Sp
IF EXISTS (SELECT * 
           FROM   sysobjects 
           WHERE  id = Object_id('[dbo].[sp_cp_test]') 
                  AND Objectproperty(id, 'IsProcedure') = 1 
                  AND xtype = 'p' 
                  AND NAME = 'sp_cp_test') 
  BEGIN 
      SET @Proc=@Alter + @Proc 

      EXEC (@proc) 
  END 
ELSE 
  BEGIN 
      SET @Proc=@Create + @Proc 

      EXEC (@proc) 
  END 

go 

0

एक बेहतर विकल्प हो सकता है कि रेड-गेट एसक्यूएल या एसक्यूएल एग्जामिनर जैसे टूल का उपयोग करके अंतरों की स्वचालित रूप से तुलना करें और माइग्रेशन स्क्रिप्ट जेनरेट करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.