【问题标题】:Is there a way to make Visual Studio 2010 database projects use DROP and CREATE instead of ALTER for DML有没有办法让 Visual Studio 2010 数据库项目对 DML 使用 DROP 和 CREATE 而不是 ALTER
【发布时间】:2012-08-26 14:32:13
【问题描述】:

在为 Visual Studio 2010 SQL 数据库项目构建部署脚本时,是否有任何方法可以指示进程对存储过程和其他 DML 使用 DROP 和 CREATE,而不是始终更改它们?

例如,如果我更改存储过程,部署脚本将生成类似这样的内容...

ALTER PROCEDURE MyProc
AS
SELECT yadda...

我希望部署脚本改为​​创建类似的内容

IF EXISTS MyProc
  DROP MyProc

CREATE PROCEDURE MyProc
AS 
SELECT yadda....

这将使版本控制的升级脚本更易于管理,并且部署的更改会执行得更好。此外,如果这是不可能的,那么至少使用 ALTER 发出 RECOMPILE 的方法会有所帮助。

This 问题提出了一些看起来相似的问题,但我不希望表格出现这种行为,只希望 DML。

【问题讨论】:

    标签: visual-studio-2010 database-project


    【解决方案1】:

    我对数据库项目不够熟悉,无法回答是否可以进行 DROP 和 CREATE。但是,总的来说,我发现 CREATE 和 ALTER 比 DROP 和 CREATE 更好。

    通过 CREATE 和 ALTER 我的意思是:

    IF NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.ROUTINES 
                    WHERE ROUTINE_NAME = 'MyProc'
                    AND ROUTINE_TYPE = 'PROCEDURE')
    BEGIN;
        -- CREATE PROC has to be the first statement in a batch so 
        --  cannot appear within a conditional block.  To get around 
        --  this, make the statement a string and use sp_ExecuteSql.
        DECLARE @DummyCreateText NVARCHAR(100);
        SET @DummyCreateText = 'CREATE PROC dbo.MyProc AS SELECT 0;';
        EXEC sp_ExecuteSql @DummyCreateText;
    END;
    GO
    
    ALTER PROCEDURE dbo.MyProc  
    AS
        SELECT yadda...
    

    CREATE 和 ALTER 优于 DROP 和 CREATE 的优点是存储过程只创建一次。一旦创建,它就永远不会被丢弃,因此权限不会被丢弃并且不会被重新创建。

    在理想情况下,存储过程的权限将通过数据库角色应用,因此在删除并重新创建存储过程后重新应用它们很容易。然而,实际上,我经常发现几年后其他应用程序可能会开始使用相同的存储过程,或者出于某种原因,善意的 DBA 可能会申请新的权限。所以 我发现 DROP 和 CREATE 往往会导致应用程序在几年后崩溃(而且当它是您一无所知的其他人的应用程序时,情况总是更糟)。 CREATE 和 ALTER 避免了这些问题。

    顺便说一句,虚拟创建语句“CREATE PROC dbo.MyProc AS SELECT 0”适用于任何存储过程。如果真正的存储过程将有参数或返回一个包含多个列的记录集,这些列都可以在 ALTER PROC 语句中指定。 CREATE PROC 语句只需要创建最简单的存储过程。 (当然,CREATE PROC 语句中的存储过程的名称需要更改以匹配您的存储过程的名称)

    【讨论】:

    • 由于这些将是部署脚本的一部分,因此在部署过程中总会有权限设置/重置。此外,在某些情况下,ALTER 不会导致重新编译,这就是我想要 DROP/CREATE 的原因。
    猜你喜欢
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多