如何检测存储过程是否已存在

Gor*_*yII 127 sql stored-procedures sql-server-2005

我必须编写一个部署脚本,如果存储过程存在或不存在,该脚本将起作用.即如果它存在,那么我需要改变它,否则创建它.

我怎么能在sql中这样做.

我正在使用SQL Server 2005

And*_*mar 159

如果您DROP并创建该过程,您将失去安全设置.这可能会惹恼您的DBA或完全破坏您的应用程序.

我所做的是创建一个简单的存储过程,如果它还不存在.之后,您可以根据自己的喜好更改存储过程.

IF object_id('YourSp') IS NULL
    EXEC ('create procedure dbo.YourSp as select 1')
GO
ALTER PROCEDURE dbo.YourSp
AS
...
Run Code Online (Sandbox Code Playgroud)

这样,安全设置,注释和其他元细分将在部署后继续存在.

  • 认为另一个答案更完整,因为它只为存储过程提取对象ID.对于不同类型具有相同名称并不常见,但它可能发生 (4认同)
  • 至少如果你删除它,你知道你必须重新添加权限.如果您运行此sql,您将不知道sproc是否具有正确的权限,因为您不知道您是创建了它还是更改了它. (2认同)

Aar*_*ton 142

最干净的方法是测试它的存在,如果它存在则删除它,然后重新创建它.您不能在IF语句中嵌入"create proc"语句.这应该做得很好:

IF OBJECT_ID('MySproc', 'P') IS NOT NULL
DROP PROC MySproc
GO

CREATE PROC MySproc
AS
BEGIN
    ...
END
Run Code Online (Sandbox Code Playgroud)

  • 安全性更改也应该是脚本的一部分.这样,它将得到适当的记录.这是正确的方法. (18认同)
  • @AdriaanDavel l这就是DBA的用途,让DBA与开发人员交谈称为管理.如果开发人员和DBA无法一起工作,那么公司就会出现问题.此外,正确实现的系统不依赖于用户权限来触摸数据库,这就是服务帐户的用途,服务级别的安全性应该适用于整个数据库,这样DBA就不必花费时间和金钱来调整安全性.个别的sprocs. (2认同)
  • 我不会让开发人员丢弃/重新创建属于商业产品的sprocs.来考虑一下,我也不会让DBA这样做.不过,我看到了你所得到的,"如果DBA需要在部署商业产品的sproc上调整安全性,那该怎么办".我将重申,正确实现的系统不依赖于用户权限,并且应该在数据库范围内应用服务级别的安全性.我已经与将安装到演示/暂存系统的DBA合作,然后进行模式比较以确保升级是安全的,IMO这是他们雇用的. (2认同)

Jas*_*onS 31

如果您只处理存储过程,最简单的方法是删除proc,然后重新创建它.您可以使用SQL Server中的Generate Scripts向导生成所有代码来执行此操作.

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...
Run Code Online (Sandbox Code Playgroud)

  • 不要忘记权限!你必须在创建sp后重新授予它们 (2认同)

Pரத*_*ீப் 17

SQL Server 2016 CTP3您可以使用新的DIE 语句而不是大IF包装器

句法:

DROP {PROC | 程序} [IF EXISTS] {[schema_name.]程序} [,... n]

查询:

DROP PROCEDURE IF EXISTS usp_name
Run Code Online (Sandbox Code Playgroud)

更多信息在这里


Luk*_*fer 11

编辑:在代码块杀死之前不放文本...总是忘记:)

if not exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[xxx]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
BEGIN
CREATE PROCEDURE dbo.xxx
Run Code Online (Sandbox Code Playgroud)

其中xxx是proc名称


sha*_*ath 5

您可以按如下方式编写查询:

IF OBJECT_ID('ProcedureName','P') IS NOT NULL
    DROP PROC ProcedureName
GO

CREATE PROCEDURE [dbo].[ProcedureName]
...your query here....
Run Code Online (Sandbox Code Playgroud)

更具体地说明上述语法:
OBJECT_ID是数据库中对象的唯一 ID 号,它由 SQL Server 在内部使用。由于我们传递的是ProcedureName后跟对象类型P,它告诉 SQL Server 你应该找到名为ProcedureName的对象,它是过程类型,即 P

此查询将找到该过程,如果它可用,它将删除它并创建新的过程。

有关 OBJECT_ID 和对象类型的详细信息,请访问:SYS.Objects