回答:
プロシージャを削除して作成すると、セキュリティ設定が失われます。これは、DBAを困らせるか、アプリケーションを完全に破壊する可能性があります。
私がやっていることは、それがまだ存在しない場合、簡単なストアドプロシージャを作成することです。その後、必要に応じてストアドプロシージャを変更できます。
IF object_id('YourSp') IS NULL
EXEC ('create procedure dbo.YourSp as select 1')
GO
ALTER PROCEDURE dbo.YourSp
AS
...
このようにして、セキュリティ設定、コメント、およびその他のメタデータは、展開後も存続します。
if object_id('YourSp') is null BEGIN ... END
、ストアドプロシージャの作成後に適切なアクセス許可を追加するためのコードを追加するという簡単なソリューションがあります。
最もクリーンな方法は、その存在をテストし、存在する場合は削除してから再作成することです。IFステートメント内に「create proc」ステートメントを埋め込むことはできません。これはうまくいくはずです:
IF OBJECT_ID('MySproc', 'P') IS NOT NULL
DROP PROC MySproc
GO
CREATE PROC MySproc
AS
BEGIN
...
END
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
プロシージャ名はどこですか
すでに述べたことに加えて、私は別のアプローチを追加して、差分スクリプト展開戦略の使用を提唱することも好きです。常に現在の状態をチェックし、その状態に基づいて動作するステートフルスクリプトを作成する代わりに、既知のバージョンからアップグレードする一連のステートレススクリプトを介してデプロイします。私はこの戦略を使用しましたが、私の展開スクリプトはすべて「IF」フリーになっているので、大きなメリットがあります。
クエリは次のように記述できます。
IF OBJECT_ID('ProcedureName','P') IS NOT NULL
DROP PROC ProcedureName
GO
CREATE PROCEDURE [dbo].[ProcedureName]
...your query here....
上記の構文を具体的に説明すると、
OBJECT_IDはデータベース内のオブジェクトの一意のID番号であり、SQL Serverによって内部的に使用されます。ここでは、ProcedureNameの後にオブジェクトタイプPを渡しています。これは、タイプP、つまりPであるProcedureNameと呼ばれるオブジェクトを見つける必要があることをSQL Serverに伝えます。
このクエリはプロシージャを検索し、使用可能な場合はそれを削除して新しいプロシージャを作成します。
OBJECT_IDおよびオブジェクトタイプの詳細については、SYS.Objectsにアクセスしてください。
私は、顧客が検証を拡張できるストアドプロシージャを持っています。それが存在する場合、変更したくない場合、作成したくない場合、私が見つけた最良の方法です。
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
以下のコードは、ストアドプロシージャが既に存在するかどうかを確認します。
存在する場合は変更され、存在しない場合は新しいストアドプロシージャが作成されます。
//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