Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
改变与放弃&;在SQL Server中创建_Sql_Sql Server_Sql Server 2005_Tsql_Sql Server 2008 - Fatal编程技术网

改变与放弃&;在SQL Server中创建

改变与放弃&;在SQL Server中创建,sql,sql-server,sql-server-2005,tsql,sql-server-2008,Sql,Sql Server,Sql Server 2005,Tsql,Sql Server 2008,在SQL Server中创建存储过程后,为什么要将Create替换为Alter?如果我们不改变它,执行时会发生什么?除了检查是否存在并删除外,还有更好的替代方法吗?如果表存在,则创建将失败更改将失败 如果您问为什么要使用Alter,如果您可以删除并创建,有几个原因: 某些权限已分配给对象,如果删除该对象,则需要重新分配权限 对象可能被具有模式绑定的其他对象使用 根据我的经验 每当提供数据库构建时,最好检查是否存在要删除的存储过程,然后重新创建该过程 调试过程时可能会从create更改为alt

在SQL Server中创建存储过程后,为什么要将
Create
替换为
Alter
?如果我们不改变它,执行时会发生什么?除了检查是否存在并删除外,还有更好的替代方法吗?

如果表存在,则创建将失败<如果表不存在,代码>更改将失败

如果您问为什么要使用
Alter
,如果您可以删除并创建,有几个原因:

  • 某些权限已分配给对象,如果删除该对象,则需要重新分配权限
  • 对象可能被具有模式绑定的其他对象使用
根据我的经验

  • 每当提供数据库构建时,最好检查是否存在要删除的存储过程,然后重新创建该过程

  • 调试过程时可能会从create更改为alter,但这不是提供build时的标准做法

SQL Server中没有“创建或替换”语法(与其他RDBMS一样)

如果我不确定某些东西是否存在,我倾向于使用这种模式

IF OBJECT_ID('dbo.MyProc') IS NOT NULL
   DROP PROC dbo.MyProc
GO
CREATE PROC dbo.MyProc
...
GO
GRANT EXECUTE ---
GO

关于有用脚本的主题,我更喜欢创建过程(如果不存在),然后修改它

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

Alter procedure dpm.TableCellLoad

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

FYI:存储过程不支持schemabindingunfortunately@gbn-哦,你是对的,但是对函数来说是有意义的。是的。我总是用。我希望存储过程也有它。和+1。我还要补充一点,ALTER保留扩展属性。一些ORM工具和设计器使用扩展属性。在我的例子中,当我尝试更改Proc时,它会告诉我“无效的对象名称XXXXX”,然后当我使用Create Proc时,它会工作并更改回Alter,它仍然工作。。。谁能解释为什么?我也喜欢这样做。问题是,有时架构和权限由不同的方管理。@Alex Aza:是的,我们实际上使用和权限架构,因此对象当然会继承,而我们没有对象级权限。然而,当有人问这样的问题时,他们往往不会有这样的关注点分离等