Подтвердить что ты не робот

Создавать хранимую процедуру, если она не существует на сервере 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 должен быть первым утверждением в ошибке пакета" так или иначе.

4b9b3361

Ответ 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