DROP ... CREATE vs ALTER

DCN*_*YAM 57 sql t-sql sql-server

在创建存储过程,视图,函数等时,最好对对象执行DROP ... CREATE或ALTER吗?

我已经看过许多"标准"文件,说明要做DROP ... CREATE,但我看到了许多提倡ALTER方法的评论和论据.

ALTER方法保留了安全性,而我听说DROP ... CREATE方法在第一次执行时强制重新编译整个SP而不仅仅是一个语句级别的重新编译.

有人可以告诉我,如果使用一个优于另一个有其他优点/缺点吗?

And*_*mar 53

这是我们的做法:

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)

如果代码尚不存在,则代码会创建"存根"存储过程,否则会执行更改.这样,即使重复执行脚本,也会保留对过程的任何现有权限.

  • 最好做object_id('dbo.YourSP')否则你可能最终改变一个不存在的表,除了另一个所有者 (4认同)

Rem*_*anu 53

ALTER还将强制重新编译整个过程.语句级别重新编译适用于过程内的语句,例如.单个SELECT,由于基础表发生更改而重新编译,没有对过程进行任何更改.甚至不可能有选择地重新编译ALTER过程中的某些语句,以便了解在服务器必须编译它的ALTER过程之后SQL文本中发生了什么变化.

对于所有对象,ALTER总是更好,因为它保留了所有安全性,所有扩展属性,所有依赖性和所有约束.


Dan*_*now 9

从 SQL Server 2016 SP1 开始,您现在可以选择使用CREATE OR ALTER存储过程、函数、触发器和视图的语法。请参阅SQL Server 数据库引擎博客上的CREATE OR ALTER – SQL Server 2016 SP1 中另一项出色的语言增强功能。例如:

CREATE OR ALTER PROCEDURE dbo.MyProc
AS
BEGIN
    SELECT * FROM dbo.MyTable
END;
Run Code Online (Sandbox Code Playgroud)

  • 不确定为什么您的答案没有获得更多赞成票。我知道大多数客户通常使用旧版本的 SQL Server,但这对于新版本来说应该是最重要的。 (2认同)

kem*_*002 8

改变通常更好.如果删除并创建,则可能会丢失与该对象关联的权限.