我一直在使用SQL Server數據工具,MS構建和Jenkins自動化數據庫部署。我正在使用虛擬發佈配置文件MS建立發佈SSDT項目錯誤創建SQL Server登錄
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<IncludeCompositeObjects>True</IncludeCompositeObjects>
<TargetDatabaseName>AdventureWorksDW</TargetDatabaseName>
<DeployScriptFileName>AdventureWorksDW.sql</DeployScriptFileName>
<TargetConnectionString>Data Source=.;Integrated Security=True;Pooling=False</TargetConnectionString>
<BlockWhenDriftDetected>False</BlockWhenDriftDetected>
<RegisterDataTierApplication>False</RegisterDataTierApplication>
<BlockOnPossibleDataLoss>True</BlockOnPossibleDataLoss>
<IgnorePermissions>True</IgnorePermissions>
<CreateNewDatabase>True</CreateNewDatabase>
<ProfileVersionNumber>1</ProfileVersionNumber>
</PropertyGroup>
</Project>
然後,我使用帶有ms build的屬性開關重寫此範圍內的某些值。
儘管未包含項目中的權限並將IgnorePermisssions設置爲true,但我從ms build中獲得以下輸出。
Microsoft (R) Build Engine version 4.0.30319.17929
[Microsoft .NET Framework, version 4.0.30319.17929]
Copyright (C) Microsoft Corporation. All rights reserved.
Build started 05/09/2012 17:35:28.
Project "E:\Jenkins\workspace\Publish SSDT with parameters\Database\ETL POC\AdventureWorksDW\AdventureWorksDW.sqlproj" on node 1 (Publish target(s)).
SqlPublish:
Deployment script generated to:
E:\Jenkins\workspace\Publish SSDT with parameters\Database\ETL POC\AdventureWorksDW\bin\Debug\AdventureWorksDW.publish.sql
Creating AdventureWorksDW...
Creating [My-Domain\jenkins]...
E:\Jenkins\workspace\Publish SSDT with parameters\Database\ETL POC\AdventureWorksDW\bin\Debug\AdventureWorksDW.publish.sql(173,1,173,1): Deploy error SQL72014: .Net SqlClient Data Provider: Msg 15063, Level 16, State 1, Line 1 The login already has an account under a different user name. [E:\Jenkins\workspace\Publish SSDT with parameters\Database\ETL POC\AdventureWorksDW\AdventureWorksDW.sqlproj]
An error occurred while the batch was being executed.
Done Building Project "E:\Jenkins\workspace\Publish SSDT with parameters\Database\ETL POC\AdventureWorksDW\AdventureWorksDW.sqlproj" (Publish target(s)) -- FAILED.
Build FAILED.
編輯:
我現在已經歸檔MSBuild中發佈腳本。下面的部分已被編輯,以排除正在設置的不相關的數據庫選項,並在導致錯誤的命令結束。
/*
Deployment script for AdventureWorksDW
This code was generated by a tool.
Changes to this file may cause incorrect behavior and will be lost if
the code is regenerated.
*/
GO
SET ANSI_NULLS, ANSI_PADDING, ANSI_WARNINGS, ARITHABORT, CONCAT_NULL_YIELDS_NULL, QUOTED_IDENTIFIER ON;
SET NUMERIC_ROUNDABORT OFF;
GO
:setvar DatabaseName "AdventureWorksDW"
:setvar DefaultFilePrefix "AdventureWorksDW"
:setvar DefaultDataPath "E:\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\"
:setvar DefaultLogPath "E:\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\"
GO
:on error exit
GO
/*
Detect SQLCMD mode and disable script execution if SQLCMD mode is not supported.
To re-enable the script after enabling SQLCMD mode, execute the following:
SET NOEXEC OFF;
*/
:setvar __IsSqlCmdEnabled "True"
GO
IF N'$(__IsSqlCmdEnabled)' NOT LIKE N'True'
BEGIN
PRINT N'SQLCMD mode must be enabled to successfully execute this script.';
SET NOEXEC ON;
END
GO
USE [master];
GO
IF (DB_ID(N'$(DatabaseName)') IS NOT NULL)
BEGIN
ALTER DATABASE [$(DatabaseName)]
SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
DROP DATABASE [$(DatabaseName)];
END
GO
PRINT N'Creating $(DatabaseName)...'
GO
CREATE DATABASE [$(DatabaseName)]
ON
PRIMARY(NAME = [$(DatabaseName)], FILENAME = N'$(DefaultDataPath)$(DefaultFilePrefix)_Primary.mdf')
LOG ON (NAME = [$(DatabaseName)_log], FILENAME = N'$(DefaultLogPath)$(DefaultFilePrefix)_Primary.ldf') COLLATE Latin1_General_CI_AS
GO
GO
PRINT N'Creating [MY-DOMAIN\jenkins]...';
GO
CREATE USER [MY-DOMAIN\jenkins] FOR LOGIN [DR-FOSTER\jenkins];
我在Jenkins之外運行了這個腳本,它成功了,但是在不同的用戶帳戶下。
似乎儘管MY-DOMAIN \ jenkins創建數據庫,因此作爲發佈腳本想要創建用戶並將其設置爲db_owner的所有者。
有沒有人有類似的經驗?這開始感覺像一個錯誤。
感謝
已更新爲包含發佈腳本。 –
我的理解是否正確:腳本是由SSDT生成的,並且您在數據庫中指定了一個用戶要求SSDT創建的用戶,但該用戶與執行構建的用戶是相同的用戶? (我剛剛意識到這個問題有多大,請隨時以此爲提示回答自己,如果你已經知道了這一點,可以獲得積分)。 – Jaykul