(可选)包括SQL Server Projects 2012中的脚本

时间:2013-11-22 07:46:37

标签: sql-server visual-studio-2012 project sql-server-data-tools sql-server-2012-datatools

我正在构建一个SQL发布脚本,用于为我们的内部服务器生成数据库,然后由我们的客户端在外部使用。

我遇到的问题是我们的内部脚本会为我们自动化很多东西,实际的生产环境需要手动完成这些。

例如,在内部我们将使用以下脚本

-- Global variables
:setvar EnvironmentName 'Local'

-- Script.PostDeployment.sql

:r .\PopulateDefaultValues.sql

IF ($(EnvironmentName) = 'Test')
BEGIN
   :r .\GivePermissionsToDevelopmentTeam.sql
   :r .\PopulateTestData.sql
   :r .\RunETL.sql
END
ELSE IF ($(EnvironmentName) = 'Client_Dev')
BEGIN
   :r .\GivePermissionsToDevWebsite.sql
END

这将生成如下脚本:

-- (Ignore syntax correctness, its just the process I'm after)

IF($(EnvironmentName) = 'Test')
BEGIN
    CREATE LOGIN [Developer1] AS USER [MyDomain\Developer1] WITH DEFAULT SCHEMA=[dbo];
    CREATE LOGIN [Developer2] AS USER [MyDomain\Developer2] WITH DEFAULT SCHEMA=[dbo];
    CREATE LOGIN [Developer3] AS USER [MyDomain\Developer3] WITH DEFAULT SCHEMA=[dbo];

    -- Populate entire database (10000's of rows over 100 tables)
    INSERT INTO Products ( Name, Description, Price ) VALUES
    ( 'Cheese Balls', 'Cheesy Balls ... mm mm mmmm', 1.00),
    ( 'Cheese Balls +', 'Cheesy Balls with a caffeine kick', 2.00),
    ( 'Cheese Squares', 'Cheesy squares with a hint of ginger', 2.50);

    EXEC spRunETL 'AUTO-DEPLOY';
END
ELSE IF($(EnvironmentName) = 'Client_Dev')
BEGIN
    CREATE LOGIN [WebLogin] AS USER [FABRIKAM\AppPoolUser];
END
END IF

这对我们来说很好。在站点上执行此脚本时,脚本将失败,因为它无法对内部环境的用户进行身份验证。

我认为权限的一个项目就是给我们内部团队sysadmin权限,但测试数据只是填充了脚本。当进入现场时,拥有所有这些测试数据只会使已发布的脚本膨胀,并且无论如何都不会被使用。

有没有办法完全从发布的文件中排除某个部分,以便删除所有测试数据和异常插入,而无需对已发布文件进行任何手动干预?

1 个答案:

答案 0 :(得分:0)

不幸的是,目前无法完全从生成的文件中删除引用脚本的内容。

实现这一目标的唯一方法是对生成的脚本(选择的Powershell / Ruby /脚本语言)进行后处理,以使用某种形式的字符串和文件操作来查找和删除您关心的部分。

基于:我完成同样的事情来删除一个仅限开发环境的脚本,这个脚本相当大,并且生产部署脚本带有很多“噪音”,这使得DBA更难以审查脚本