0

我在TFS存儲庫中維護我的Powershell腳本文件和SQL文件。我正在嘗試從Powershell腳本(它也位於TFS中)準備我的SQL文件。我在構建中調用這個powershell腳本。我在執行時遇到錯誤。在位於TFS的Powershell腳本文件中,如何讀取駐留在TFS中的SQL文件?

$ServerInstance = "ABCServer" 
$Database = "MyDB" 
$ConnectionTimeout = 30 
$Query = get-content "$/MYPROJECT/Queries/GetProjects.sql" 
$QueryTimeout = 120 

$conn=new-object System.Data.SqlClient.SQLConnection 
$ConnectionString = "Server={0};Database={1};Integrated Security=True;Connect Timeout={2}" -f  $ServerInstance,$Database,$ConnectionTimeout 
$conn.ConnectionString=$ConnectionString 
$conn.Open() 
$cmd=new-object system.Data.SqlClient.SqlCommand($Query,$conn) 
$cmd.CommandTimeout=$QueryTimeout 
$ds=New-Object system.Data.DataSet 
$da=New-Object system.Data.SqlClient.SqlDataAdapter($cmd) 
[void]$da.fill($ds) 
$ds.Tables[0] | foreach { 
    write-host 'Name value is : ' + $_.Title 
} 
$conn.Close() 
#$ds.Tables 

我PowerShell是保存在 「$/MYPROJECT/PowershellScripts/QueryDB.ps1」

我有這個PowerShell的加入TFS任務在我的構建步驟。我收到以下錯誤

**PathNotFound,Microsoft.PowerShell.Commands.GetContentCommand 
Exception calling "Open" with "0" argument(s): "Cannot open database "MyDB" requested by the login** 
+0

貌似TFS一部分被不同的帳戶下運行,並缺乏權限的數據庫。檢查Sql Server的日誌失敗的登錄嘗試。 – vonPryz

回答

0

UPDATE:

在構建過程中,會先得到源(.sql文件),以代理計算機。它與在代理機器上運行PS腳本時設置的變量"$env:BUILD_REPOSITORY_LOCALPATH/Queries/GetProjects.sql"一起工作。

如果您需要在其他機器(不是代理機器)上運行PS腳本,則必須先將腳本文件複製到該機器,然後在腳本中指定實際的文件路徑。


我可以重現問題,請按照下列步驟來解決這個問題:

  1. 修改GetProjects.sql文件路徑在您的項目結構,這樣基於 您的PowerShell腳本:(見截圖的例子)

    $Query = get-content "$env:BUILD_REPOSITORY_LOCALPATH/Queries/GetProjects.sql"

所以,完整的PS腳本應該是:

$ServerInstance = "ABCServer" 
$Database = "MyDB" 
$ConnectionTimeout = 30 
$Query = get-content "$env:BUILD_REPOSITORY_LOCALPATH/Queries/GetProjects.sql" 
$QueryTimeout = 120 

$conn=new-object System.Data.SqlClient.SQLConnection 
$ConnectionString = "Server={0};Database={1};Integrated Security=True;Connect Timeout={2}" -f  $ServerInstance,$Database,$ConnectionTimeout 
$conn.ConnectionString=$ConnectionString 
$conn.Open() 
$cmd=new-object system.Data.SqlClient.SqlCommand($Query,$conn) 
$cmd.CommandTimeout=$QueryTimeout 
$ds=New-Object system.Data.DataSet 
$da=New-Object system.Data.SqlClient.SqlDataAdapter($cmd) 
[void]$da.fill($ds) 
$ds.Tables[0] | foreach { 
    write-host 'Name value is : ' + $_.Title 
} 
$conn.Close() 
#$ds.Tables 
  • 添加生成代理服務帳戶(默認服務帳戶 應該NT AUTHORITY \ NETWORK SERVICE如果你沒有改變它) 作爲數據庫(「MyDB」)用戶的登錄和查詢權限。

  • 轉到數據庫 >>安全 >>用戶NT AUTHORITY \ NETWORK SERVICE點擊右鍵,選擇屬性

  • 在登錄屬性的新開屏,請轉至 「成員資格」選項卡。在屏幕下方,檢查角色 db_owner。點擊確定。

  • 然後嘗試再次建設,它現在應該工作。

    enter image description here

    +0

    @Barani您是否通過上述解決方法解決了您的問題?任何更新? –

    +0

    謝謝安迪。它沒有解決問題。其實PowerShell腳本是針對不同的機器。看來實際的文件是在本地機器中預期的,而不是環境變量。對於目標機器中的PS,我們需要提供實際路徑。當文件在目標機器上執行時,我使用了SQL的相對路徑並能夠實現它。 – Barani

    +0

    @Barani我更新了答案,實際上在構建過程中,它會首先將源文件(.sql文件)提供給代理機器。它在變量「$ env:BUILD_REPOSITORY_LOCALPATH/Queries/GetProjects.sql」集合的幫助下運行良好。如果你的意思是你需要在其他機器(不是代理機器)上運行PS腳本,你必須首先將腳本複製到該機器上,並在腳本中指定實際路徑。 –

    相關問題