Создавать хранимую процедуру, если она не существует на сервере sql
Oracle делает "создавать или заменять" операторы. Сервер Sql не кажется - если вы выполняете сценарий из Enterprise Manager, вместо этого вместо этого предлагается "drop and create". Откат и создание нежелательны в любой ситуации, когда вы делали гранты в хранимой процедуре, потому что она выдает любые гранты, которые сделала ваша команда администрирования базы данных. Вам действительно нужно "создать или заменить", чтобы помочь разобраться в связях между разработчиками и администраторами.
То, что я делал недавно, следующее:
use [myDatabase]
go
create procedure myProcedure as
begin
print 'placeholder'
end
go
alter procedure myProcedure as
begin
-- real sproc code here
end
go
Это делает то, что я хочу. Если процедура не существует, создайте ее, затем измените ее в правильном коде. Если процедура существует, создается сбой, и файл изменяет код с новым кодом.
Это создает другую проблему для администраторов, потому что создание создает ошибочную ошибку, если хранимая процедура уже существует. Разумеется, вводя в заблуждение в том, что вы не должны видеть красный текст ошибки, когда был достигнут желаемый результат.
Есть ли у кого способ подавить красный текст? Все, что я пробовал, приводит к тому, что "CREATE/ALTER PROCEDURE должен быть первым утверждением в ошибке пакета" так или иначе.
Ответы
Ответ 1
Это будет работать и сохранить права доступа:
use [myDatabase]
go
if object_id('dbo.myProcedure', 'p') is null
exec ('create procedure myProcedure as select 1')
go
alter procedure myProcedure as
SET NOCOUNT ON
-- real sproc code here. you don't really need BEGIN-END
go
Ответ 2
Вот так:
IF NOT EXISTS (SELECT * FROM sys.objects
WHERE object_id = OBJECT_ID(N'[dbo].[myProcedure]')
AND type in (N'P', N'PC'))
BEGIN
EXEC('
create procedure myProcedure as
begin
print ''placeholder''
end
')
END
EXEC('
alter procedure myProcedure as
begin
-- real sproc code here
end
')
ПРИМЕЧАНИЯ:
- Не забудьте удвоить свои кавычки в динамических строках SQL.
- Я отложил это для удобочитаемости, но это также добавит дополнительные промежутки отступа в ваши фактические списки процедур. Если вы этого не сделаете, просто уменьшите уровень отступов на динамическом тексте SQL.
Ответ 3
Наконец, день здесь, где SQL Server реализовал эквивалент Create или Replace. Их эквивалент - "Создать или изменить". Это доступно в SQL Server 2016 SP1. Пример использования:
use [myDatabase]
go
Create or Alter procedure myProcedure as
begin
-- procedure code here
end
go