답변:
프로 시저를 삭제하고 작성하면 보안 설정이 해제됩니다. 이로 인해 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
저장 프로 시저 만 처리하는 경우 가장 쉬운 방법은 proc을 삭제 한 다음 다시 만드는 것입니다. SQL Server의 스크립트 생성 마법사를 사용하여이 작업을 수행하는 모든 코드를 생성 할 수 있습니다.
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'가 아니므로 시간이 많이 걸립니다.
다음과 같이 쿼리를 작성할 수 있습니다.
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 는 호출 된 객체 찾아야하는 SQL 서버를 알려줍니다 ProcedureName 타입이다 절차 즉, P를
이 쿼리는 프로 시저를 찾은 후 사용 가능한 경우이를 삭제하고 새 프로 시저를 작성합니다.
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