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脚本,你必须首先将脚本复制到该机器上,并在脚本中指定实际路径。 –

    相关问题