Мне нужно написать сценарий развертывания, который будет работать, если хранимая процедура существует или не существует. т.е. если он существует, то мне нужно его изменить, иначе создать.
Как я могу это сделать в sql.
Я использую SQL Server 2005
Мне нужно написать сценарий развертывания, который будет работать, если хранимая процедура существует или не существует. т.е. если он существует, то мне нужно его изменить, иначе создать.
Как я могу это сделать в sql.
Я использую SQL Server 2005
Ответы:
Если вы УДАЛИТЕ и СОЗДАЕТЕ процедуру, вы потеряете настройки безопасности. Это может раздражать администратора базы данных или вообще нарушить работу вашего приложения.
Что я делаю, так это создаю тривиальную хранимую процедуру, если она еще не существует. После этого вы можете ИЗМЕНИТЬ хранимую процедуру по своему усмотрению.
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
для добавления соответствующих разрешений после создания хранимой процедуры.
Самый чистый способ - проверить его существование, отбросить, если он существует, а затем воссоздать его. Вы не можете встроить оператор create proc в оператор IF. Это должно хорошо работать:
IF OBJECT_ID('MySproc', 'P') IS NOT NULL
DROP PROC MySproc
GO
CREATE PROC MySproc
AS
BEGIN
...
END
Если вы имеете дело только с хранимыми процедурами, проще всего, вероятно, отказаться от процедуры, а затем воссоздать ее. Вы можете сгенерировать весь код для этого с помощью мастера создания сценариев в 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 OBJECT_ID('ProcedureName','P') IS NOT NULL
DROP PROC ProcedureName
GO
CREATE PROCEDURE [dbo].[ProcedureName]
...your query here....
Чтобы быть более конкретным в приведенном выше синтаксисе:
OBJECT_ID - это уникальный номер идентификатора для объекта в базе данных, он используется внутри SQL Server. Поскольку мы передаем имя процедуры, за которым следует тип объекта P, который сообщает SQL-серверу, что вы должны найти объект с именем имя процедуры, который имеет тип процедуры, т. Е. P
Этот запрос найдет процедуру и, если она доступна, отбросит ее и создаст новую.
Для получения подробной информации о OBJECT_ID и типах объектов посетите: SYS.Objects
IF OBJECT_ID('SPNAME') IS NULL
-- Does Not Exists
ELSE
-- Exists
У меня есть хранимая процедура, которая позволяет клиенту продлить проверку, если она существует, я не хочу ее менять, если она не хочет, я ее создаю, лучший способ, который я нашел:
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