Я повинен написати сценарій розгортання, який буде працювати, якщо збережена процедура існує чи не існує. тобто якщо воно існує, то мені потрібно його змінити, інакше створити.
Як я можу це зробити в sql.
Я використовую SQL Server 2005
Я повинен написати сценарій розгортання, який буде працювати, якщо збережена процедура існує чи не існує. тобто якщо воно існує, то мені потрібно його змінити, інакше створити.
Як я можу це зробити в sql.
Я використовую SQL Server 2005
Відповіді:
Якщо ви скасуєте та створили процедуру, ви втратите налаштування безпеки. Це може дратувати вашу 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
щоб додати належні дозволи після створення збереженої процедури.
Найчистіший спосіб - перевірити його існування, скинути його, якщо він існує, а потім відтворити його. Ви не можете вставити оператор "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 сервером. Оскільки ми передаємо ProcedureName, за яким ви об'єкту типу P, який повідомляє SQL Server, що ви повинні знайти об'єкт під назвою ProcedureName, який є типом процедури, тобто 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