একটি সঞ্চিত পদ্ধতি ইতিমধ্যে বিদ্যমান কিনা তা কীভাবে সনাক্ত করবেন


130

আমাকে একটি ডিপ্লোয়মেন্ট স্ক্রিপ্ট লিখতে হবে যা কোনও সঞ্চিত পদ্ধতি উপস্থিত থাকলে বা উপস্থিত না থাকলে কাজ করবে। অর্থাত্ যদি এটি বিদ্যমান থাকে তবে আমার এটি পরিবর্তন করতে হবে অন্যথায় এটি তৈরি করতে হবে।

আমি কীভাবে এটি স্কুএলে করতে পারি।

আমি এসকিউএল সার্ভার 2005 ব্যবহার করছি


উত্তর:


160

আপনি যদি প্রক্রিয়াটি ড্রপ এবং তৈরি করেন তবে আপনি সুরক্ষা সেটিংসটি আলগা করবেন। এটি আপনার ডিবিএকে বিরক্ত করতে পারে বা আপনার অ্যাপ্লিকেশন পুরোপুরি ভঙ্গ করতে পারে।

আমি যা করি তা হ'ল একটি তুচ্ছ संग्रहিত প্রক্রিয়া তৈরি করা যদি এটি উপস্থিত না থাকে। এর পরে, আপনি আপনার পছন্দ অনুসারে সঞ্চিত পদ্ধতিটি পরিবর্তন করতে পারবেন।

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

এইভাবে, সুরক্ষা সেটিংস, মন্তব্যগুলি এবং অন্যান্য মেটা ডিটা মোতায়েন থেকে বেঁচে থাকবে।


2
কমপক্ষে যদি আপনি এটি ফেলে দেন তবে আপনি জানবেন আপনাকে অনুমতিগুলি আবার যুক্ত করতে হবে। আপনি যদি এই স্কয়ারটি চালাতেন তবে আপনি জানেন না যে স্প্রোকের সঠিক অনুমতি আছে কিনা তা আপনি জানেন না আপনি এটি তৈরি করেছেন বা পরিবর্তন করেছেন কিনা তা আপনি জানেন না।
লায়াজি

if object_id('YourSp') is null BEGIN ... ENDসঞ্চিত পদ্ধতি তৈরির পরে সঠিক অনুমতিগুলি যুক্ত করার জন্য কোডটিতে কোড যুক্ত করার সহজ সমাধানটি লায়াজি করুন ।
স্যালুস করুন

4
ভাবেন যে অন্য উত্তরটি আরও কিছুটা সম্পূর্ণ কারণ এটি কেবল সঞ্চিত পদ্ধতির জন্য অবজেক্ট আইডি টানে। বিভিন্ন ধরণের জন্য একই নামটি পাওয়া সাধারণ নয় তবে এটি ঘটতে পারে
ওয়ার্কাবাইট

149

সবচেয়ে পরিষ্কার উপায় হ'ল এর অস্তিত্বের জন্য পরীক্ষা করা, এটি উপস্থিত থাকলে এটি ফেলে দিন এবং তারপরে এটি পুনরায় তৈরি করুন। আপনি যদি কোনও আইএফ স্টেটমেন্টের অভ্যন্তরে একটি "তৈরি করান" বিবৃতি এম্বেড করতে পারবেন না। এটি সুন্দরভাবে করা উচিত:

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

CREATE PROC MySproc
AS
BEGIN
    ...
END

1
এটি কাজ করবে, তবে এটি সঞ্চিত পদ্ধতিতে প্রয়োগ হওয়া কোনও সুরক্ষা পরিবর্তনগুলি সরিয়ে দেয়।
Andomar

18
সুরক্ষা পরিবর্তনগুলিও স্ক্রিপ্টগুলির অংশ হওয়া উচিত। এইভাবে, এটি সঠিকভাবে নথিভুক্ত হবে। এটি সঠিক পন্থা।
এন্ডার উইগগিন

@ এন্ডার উইগগিন বাদে সুরক্ষা বাস্তবায়ন ডিজাইনের সময় না জানা থাকলে ... যদি বিকাশকারী না জানে যে কোন ব্যবহারকারীদের অধিকার সম্পাদন করতে হবে?
অ্যাড্রিয়ান দাভেল

2
@ অ্যাড্রিয়ায়ানড্যাভেল l এটিই ডিবিএর জন্য এবং ডিবিএগুলি বিকাশকারীদের সাথে কথা বলার জন্য তাকে বলা হয় ব্যবস্থাপনা। যদি ডেভেলপাররা এবং ডিবিএরা একসাথে কাজ করতে না পারে তবে সংস্থার সাথে সমস্যা আছে। তদুপরি, সঠিকভাবে প্রয়োগ করা সিস্টেমগুলি কোনও ডাটাবেস স্পর্শ করার জন্য ব্যবহারকারীর সুবিধার উপর নির্ভর করে না, পরিষেবা অ্যাকাউন্টগুলির জন্য এটিই এবং পরিষেবা স্তরের সুরক্ষা প্রযোজ্য ডাটাবেস-ওয়াইড হওয়া উচিত, এইভাবে ডিবিএগুলিকে সুরক্ষা দেওয়ার জন্য সময় এবং অর্থ ব্যয় করতে হবে না স্বতন্ত্র স্প্রোকস
শন উইলসন

2
আমার কাছে বিকাশকারীরা কোনও বাণিজ্যিক পণ্যের অন্তর্ভুক্ত স্প্রোকগুলি বাদ / পুনরুদ্ধার করতে পারবেন না। এটি সম্পর্কে ভাবতে আসুন, আমার ডিবিএগুলিও এটি করা হবে না। আমি দেখতে পাচ্ছি আপনি কী পেয়ে যাচ্ছেন, যেমন, "যদি ডিবিএদের একটি কমারিকাল পণ্যের জন্য পোস্ট-ডিপ্লোয়মেন্টের পরে একটি সুরক্ষার ঝাঁকুনির প্রয়োজন হয়" তবে কী হবে। আমি পুনরুক্তি করব যে সঠিকভাবে প্রয়োগ করা সিস্টেমগুলি ব্যবহারকারীর সুবিধার উপর নির্ভর করে না এবং পরিষেবা-স্তরের সুরক্ষাটি ডাটাবেস-ব্যাপী প্রয়োগ করা উচিত। আমি ডিবিএর সাথে কাজ করেছি যা একটি ডেমো / স্ক্র্যাচ সিস্টেমে ইনস্টল করবে এবং তারপরে একটি আপগ্রেড নিরাপদ কিনা তা নিশ্চিত করার জন্য একটি স্কিমা তুলনা করবে, আইএমও তারা এই কাজটি করেছে।
শন উইলসন

31

যদি আপনি কেবল সঞ্চিত প্রক্রিয়াগুলি নিয়ে কাজ করে থাকেন তবে করণীয় সবচেয়ে সহজ কাজটি সম্ভবত প্যাকটি বাদ দেওয়া হয়, তবে এটি আবার তৈরি করুন। আপনি এসকিউএল সার্ভারে স্ক্রিপ্টস জেনারেট করুন ব্যবহার করে এটি করার জন্য সমস্ত কোড তৈরি করতে পারেন।

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নতুন ডিআইই বিবৃতি ব্যবহার করতে পারেনIF

বাক্য গঠন:

DROP {PROC | প্রক্রিয়া} [যদি উপস্থিত থাকে] {[স্কিমা_নাম। ] পদ্ধতি} [, ... এন]

প্রশ্ন:

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

ইতিমধ্যে যা বলা হয়েছে তা ছাড়াও আমি একটি ভিন্ন পন্থা যুক্ত করতে এবং ডিফারেনশিয়াল স্ক্রিপ্ট মোতায়েনের কৌশল ব্যবহারের পক্ষেও চাই। একটি রাষ্ট্রীয় স্ক্রিপ্ট তৈরি করার পরিবর্তে যা সর্বদা বর্তমান অবস্থা পরীক্ষা করে এবং সেই রাজ্যের উপর ভিত্তি করে কাজ করে, সুপরিচিত সংস্করণগুলি থেকে আপগ্রেড হওয়া স্টেটহীন স্ক্রিপ্টগুলির একটি সিরিজের মাধ্যমে মোতায়েন করুন । আমি এই কৌশলটি ব্যবহার করেছি এবং এটি প্রচুর সময় দেয় কারণ আমার স্থাপনার স্ক্রিপ্টগুলি এখন সমস্ত 'আইএফ' মুক্ত।


মজাদার! আপনি এই উত্তরটি পোস্ট করার পর থেকে পাঁচ বছরে, তখন কি আপনার ডাটাবেস সংস্করণ নিয়ন্ত্রণ পদ্ধতিতে আরও উন্নতি হয়েছে?
টমাস এল Holaday

4

আপনি নিম্নলিখিত হিসাবে একটি কোয়েরি লিখতে পারেন:

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

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

উপরের সিনট্যাক্স সম্পর্কে আরও সুনির্দিষ্ট হওয়ার জন্য:
OBJECT_ID হ'ল ডাটাবেসের মধ্যে থাকা কোনও জিনিসের জন্য একটি অনন্য আইডি নম্বর, এটি এসকিউএল সার্ভার দ্বারা অভ্যন্তরীণভাবে ব্যবহৃত হয়। যেহেতু আমরা ক্ষণস্থায়ী হয় ProcedureName আপনি অনুসরণ অবজেক্ট প্রকারটি পি যা SQL সার্ভার বস্তুরটি ওপর যে বলা হবে বলে ProcedureName ধরনের যা পদ্ধতি অর্থাত, পি

এই ক্যোয়ারীটি পদ্ধতিটি আবিষ্কার করবে এবং যদি এটি উপলব্ধ থাকে তবে এটি এটিকে ফেলে দেবে এবং একটি নতুন তৈরি করবে।

OBJECT_ID এবং অবজেক্টের ধরণ সম্পর্কে বিস্তারিত তথ্যের জন্য দয়া করে দেখুন: এসওয়াইএস.অবজেক্টস



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

পার্থক্যটি স্বয়ংক্রিয়ভাবে তুলনা করতে এবং মাইগ্রেশন স্ক্রিপ্ট উত্পন্ন করার জন্য রেড-গেট এসকিউএল তুলনা বা এসকিউএল পরীক্ষকের মতো একটি সরঞ্জাম ব্যবহার করা আরও ভাল বিকল্প হতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.