在驻留在TFS中的Powershell脚本文件中,如何读取驻留在TFS中的SQL文件?

在驻留在TFS中的Powershell脚本文件中,如何读取驻留在TFS中的SQL文件?,sql,powershell,visual-studio-2012,tfs,continuous-deployment,Sql,Powershell,Visual Studio 2012,Tfs,Continuous Deployment,我正在TFS存储库中维护我的Powershell脚本文件和SQL文件。我正在尝试从Powershell脚本(也驻留在TFS中)准备SQL文件。我正在生成中调用此powershell脚本。我执行时出错 $ServerInstance = "ABCServer" $Database = "MyDB" $ConnectionTimeout = 30 $Query = get-content "$/MYPROJECT/Queries/GetProjects.sql" $QueryTimeout = 12

我正在TFS存储库中维护我的Powershell脚本文件和SQL文件。我正在尝试从Powershell脚本(也驻留在TFS中)准备SQL文件。我正在生成中调用此powershell脚本。我执行时出错

$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**

更新:

在构建过程中,它将首先将源(.sql文件)获取到代理计算机。在代理计算机上运行PS脚本时,它与变量
“$env:BUILD\u REPOSITORY\u LOCALPATH/querys/GetProjects.sql”
一起工作

如果需要在其他机器(而不是代理机器)上运行PS脚本,则必须首先将脚本文件复制到该机器,并在脚本中指定实际的文件路径


我可以复制您的问题,请按照以下步骤进行修复:

  • 在基于脚本的PowerShell中修改
    GetProjects.sql
    文件路径 在您的项目结构上,如下所示:(参见屏幕截图示例)

    $Query=get content“$env:BUILD\u REPOSITORY\u LOCALPATH/querys/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授权\网络服务并选择属性

  • 在新打开的登录属性屏幕中,转到 “成员资格”选项卡。在下方屏幕上,检查角色 数据库所有者。单击“确定”

  • 然后再次尝试构建,它现在应该可以工作了


    看起来TFS部件是在不同的帐户下运行的,它缺少对数据库的权限。请检查Sql Server的日志,查看登录尝试是否失败。@Barani您是否已通过上述解决方法解决了问题?有更新吗?谢谢你,安迪。这并没有解决问题。实际上,powershell脚本是针对不同机器的。看起来实际文件是在本地机器中预期的,而不是作为环境变量。对于目标机器中的PS,我们需要提供实际路径。由于文件是在目标机器上执行的,所以我使用了SQL的相对路径并能够实现它。@Barani我更新了答案,实际上在构建过程中,它将首先将源(.SQL文件)获取到代理机器。在我这方面,它使用变量“$env:BUILD\u REPOSITORY\u LOCALPATH/querys/GetProjects.sql”集工作得很好。如果您的意思是需要在其他机器(而不是代理机器)上运行PS脚本,那么您必须首先将脚本复制到该机器,并在脚本中指定实际路径。