【问题标题】:ALTER vs DROP & CREATE in SQL ServerSQL Server 中的 ALTER 与 DROP & CREATE
【发布时间】:2011-06-27 06:49:54
【问题描述】:

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

【问题讨论】:

    标签: sql sql-server sql-server-2005 tsql sql-server-2008


    【解决方案1】:

    如果表存在,Create 将失败。如果表不存在,Alter 将失败。

    如果你问为什么要使用Alter如果你可以drop和create的话,有几个原因:

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

    【讨论】:

    • 仅供参考:不幸的是,存储过程不支持模式绑定
    • @gbn - 哎呀,你是对的,不过对于函数来说是有意义的。
    • 是的。我总是使用schemabinding。我希望存储过程也有它。 sommarskog.se/strict_checks.html#killDNRsommarskog.se/wishlist.html
    • +1。我还要补充一点,ALTER 保留了扩展属性。 msdn.microsoft.com/en-us/library/ms190243.aspx 一些 ORM 工具和设计器使用扩展属性。
    • 就我而言,当我尝试更改 Proc 时,它告诉我“无效的对象名称 XXXXX”,然后当我使用 Create Proc 时,它可以工作并改回 Alter,它仍在工作......任何人能解释一下原因吗?
    【解决方案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:是的,我们实际上使用权限模式,因此对象当然是继承的,我们没有对象级别的权限。但是,当有人问这样的问题时,他们往往不会有这样的关注点分离等
    【解决方案3】:

    根据我的经验,

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

    • 在调试过程时可能会发生从 create 更改为 alter 的情况,但这不是提供构建时的标准做法。

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-26
        • 2018-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-12
        • 2016-09-19
        • 1970-01-01
        相关资源
        最近更新 更多