2012-09-05 59 views
1

我一直在使用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的所有者。

有沒有人有類似的經驗?這開始感覺像一個錯誤。

感謝

+1

已更新爲包含發佈腳本。 –

+1

我的理解是否正確:腳本是由SSDT生成的,並且您在數據庫中指定了一個用戶要求SSDT創建的用戶,但該用戶與執行構建的用戶是相同的用戶? (我剛剛意識到這個問題有多大,請隨時以此爲提示回答自己,如果你已經知道了這一點,可以獲得積分)。 – Jaykul

回答

2

我已經看到SQL Server錯誤嘗試將Windows用戶添加到數據庫中,當用戶已經在角色的dbowner時之前。將dbowner更改爲類似sa的東西,可以將用戶添加到數據庫中。

這將有助於共享正在處理的實際SQL語句。

+0

非常感謝,儘管它是所有者,但它的確在嘗試創建一個帳戶。我已經添加了確認這一點的發佈腳本。問題是爲什麼以這種方式生成腳本。 –