21

Oracle は「作成または置換」ステートメントを実行します。Sql サーバーはそうではないようです。Enterprise Manager からスクリプトを作成している場合は、代わりに「削除して作成する」ことを提案します。ドロップ アンド クリエイトは、データベース管理チームが行ったすべての許可を破棄するため、ストアド プロシージャに対して許可を行った場合には望ましくありません。開発者と管理者の間で問題を分離するには、「作成または置換」が本当に必要です。

私が最近やっていることはこれです:

use [myDatabase]
go

create procedure myProcedure as
begin
  print 'placeholder'
end
go

alter procedure myProcedure as
begin
  -- real sproc code here
end
go

これは私が望むことをします。プロシージャが存在しない場合は、作成してから正しいコードに変更します。プロシージャが存在する場合、作成は失敗し、alter はコードを新しいコードで更新します。

ストアド プロシージャが既に存在する場合、create は誤解を招くエラーをスローするため、管理者には別の問題が生じます。もちろん、望ましい結果が得られたときに赤いエラー テキストが表示されないという事実は誤解を招きます。

赤いテキストを抑制する方法はありますか? 私が試したことはすべて、何らかの方法で「CREATE/ALTER PROCEDUREはクエリバッチの最初のステートメントでなければなりません」というエラーにつながります。

4

3 に答える 3

51

これは機能し、権限をそのまま維持します。

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
于 2012-12-13T18:37:20.420 に答える
10

このような:

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
    ')

ノート:

  1. 動的 SQL 文字列で引用符を二重にすることを忘れないでください。
  2. 読みやすくするためにインデントしていますが、実際の手順リストに余分なインデント スペースが追加されます。それを望まない場合は、動的 SQL テキストのインデント レベルを下げてください。
于 2012-12-13T18:35:59.753 に答える