我正在构建一个 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
的权限,但测试数据只是填满了脚本。在现场进行时,拥有所有这些测试数据只会使已发布的脚本膨胀,并且无论如何都不会使用。
有没有办法从发布的文件中完全排除一个部分,以便删除所有的测试数据和额外的插入,而不需要对发布的文件进行任何手动干预?