Depolanan bir yordam varsa veya yoksa çalışacak bir dağıtım betiği yazmam gerekiyor. yani eğer varsa, onu değiştirmem gerekir, yoksa yaratırım.
Bunu sql'de nasıl yapabilirim.
SQL Server 2005 kullanıyorum
Depolanan bir yordam varsa veya yoksa çalışacak bir dağıtım betiği yazmam gerekiyor. yani eğer varsa, onu değiştirmem gerekir, yoksa yaratırım.
Bunu sql'de nasıl yapabilirim.
SQL Server 2005 kullanıyorum
Yanıtlar:
Prosedürü DÜŞÜR ve OLUŞTURURsanız, güvenlik ayarlarını kaybedersiniz. Bu, DBA'nızı rahatsız edebilir veya uygulamanızı tamamen bozabilir.
Yaptığım şey, henüz yoksa önemsiz bir saklı yordam oluşturmaktır. Bundan sonra, saklı yordamı beğeninize göre DEĞİŞTİRebilirsiniz.
IF object_id('YourSp') IS NULL
EXEC ('create procedure dbo.YourSp as select 1')
GO
ALTER PROCEDURE dbo.YourSp
AS
...
Bu şekilde, güvenlik ayarları, yorumlar ve diğer meta detaylar dağıtımdan kurtulacaktır.
if object_id('YourSp') is null BEGIN ... END
, depolanan yordamı oluşturduktan sonra uygun izinleri eklemek için kod eklemektir.
En temiz yol, varlığını test etmek, varsa onu bırakmak ve sonra yeniden yaratmaktır. Bir IF ifadesinin içine "create proc" ifadesi yerleştiremezsiniz. Bu güzelce yapmalı:
IF OBJECT_ID('MySproc', 'P') IS NOT NULL
DROP PROC MySproc
GO
CREATE PROC MySproc
AS
BEGIN
...
END
Yalnızca saklı yordamlarla uğraşıyorsanız, yapılacak en kolay şey muhtemelen proc'u bırakıp yeniden oluşturmaktır. SQL Server'daki Komut Dosyaları Oluştur sihirbazını kullanarak bunu yapmak için tüm kodu oluşturabilirsiniz.
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...
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
proc adı nerede
Daha önce söylenenlere ek olarak, farklı bir yaklaşım eklemeyi ve farklı komut dosyası dağıtım stratejisinin kullanımını savunmayı da seviyorum. Her zaman mevcut durumu kontrol eden ve bu duruma göre hareket eden durum bilgisi olan bir komut dosyası yapmak yerine, iyi bilinen sürümlerden yükseltme yapan bir dizi durumsuz komut dosyası aracılığıyla dağıtın . Bu stratejiyi kullandım ve dağıtım komut dosyalarımın tümü 'EĞER' ücretsiz olduğundan büyük zaman kazandırıyor.
Aşağıdaki gibi bir sorgu yazabilirsiniz:
IF OBJECT_ID('ProcedureName','P') IS NOT NULL
DROP PROC ProcedureName
GO
CREATE PROCEDURE [dbo].[ProcedureName]
...your query here....
Yukarıdaki sözdizimi hakkında daha spesifik olmak gerekirse:
OBJECT_ID , veritabanı içindeki bir nesne için benzersiz bir kimlik numarasıdır ve bu, SQL Server tarafından dahili olarak kullanılır. Biz geçiyoruz yana ProcedureName sizin takiben tip nesne P aradığınız nesneyi bulmak gerektiğini SQL Server söyler ProcedureName tipi olan prosedür yani P
Bu sorgu prosedürü bulacak ve eğer mevcutsa onu bırakıp yenisini oluşturacaktır.
OBJECT_ID ve Nesne türleri hakkında ayrıntılı bilgi için lütfen şu adresi ziyaret edin: SYS.Objects
IF OBJECT_ID('SPNAME') IS NULL
-- Does Not Exists
ELSE
-- Exists
Müşterinin doğrulamayı uzatmasına izin veren depolanmış bir işlemim var, varsa, değiştirmek istemiyorum, oluşturmak istemiyorsam bulduğum en iyi yol:
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
Aşağıdaki kod, saklı yordamın zaten var olup olmadığını kontrol edecektir.
Varsa değişecek, yoksa sizin için yeni bir saklı yordam oluşturacaktır:
//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