在SQL Server中,ALTER和DROP&CREATE有什么区别?

5
在SQL Server中创建存储过程后,为什么要用Alter替换Create?如果不更改会发生什么?除了检查是否存在并删除之外,有没有更好的替代方法?
4个回答

7

Create会在表存在时失败。Alter会在表不存在时失败。

如果你问为什么要使用Alter,而不是删除并创建,有几个原因:

  • 某些权限已经分配给该对象,如果你删除它,则需要重新授予权限
  • 该对象可能被其他与模式绑定的对象使用

FYI:存储过程不支持模式绑定,遗憾地说。 - gbn
@gbn - 哎呀,你是对的,不过这听起来可能更适用于函数。 - Alex Aza
是的。我总是使用schemabinding。我希望存储过程也有它。http://www.sommarskog.se/strict_checks.html#killDNR和http://www.sommarskog.se/wishlist.html - gbn
+1. 我还要补充一点,即 ALTER 保留扩展属性。http://msdn.microsoft.com/en-us/library/ms190243.aspx 一些ORM工具和设计师利用扩展属性。 - Remus Rusanu
在我的情况下,当我尝试修改存储过程时,它告诉我“无效的对象名称XXXXX”,然后当我使用创建存储过程时,它可以工作并且改回修改,它仍然可以工作...有人能解释为什么吗? - Venzentx

2
在SQL Server中没有"CREATE OR REPLACE"语法(与其他RDBMS不同)。
如果我不确定某些内容是否存在,我倾向于使用这种模式。
IF OBJECT_ID('dbo.MyProc') IS NOT NULL
   DROP PROC dbo.MyProc
GO
CREATE PROC dbo.MyProc
...
GO
GRANT EXECUTE ---
GO

我也喜欢这样做。问题是有时模式和权限由不同的方管理。 - Alex Aza
@Alex Aza:是的,我们实际上使用和许可模式,因此对象当然会继承,我们没有对象级别的权限。但是,当有人问这样的问题时,他们往往没有这样的关注点分离等。 - gbn

1

在有关有用脚本的话题上,我更喜欢创建“如果不存在则创建”过程,然后再进行修改。

IF (select object_ID('schema.Procedure')) is null
    exec('Create procedure schema.Procedure as select 1')
GO

Alter procedure dpm.TableCellLoad

这样,授予给该过程的特权将始终保留,如果该过程不存在,则创建它。

1

从我的学习经验中,

  • 每当您提供数据库构建时,最好检查存储过程是否存在以便删除并重新创建该过程。

  • 在调试过程中将创建更改为修改可能会发生,但这不是提供构建的标准做法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接