【问题标题】:In Powershell script file residing in TFS, how to read SQL File which resides in TFS?在 TFS 中的 Powershell 脚本文件中,如何读取 TFS 中的 SQL 文件?
【发布时间】:2017-12-24 11:40:24
【问题描述】:

我在 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**

【问题讨论】:

  • 看起来 TFS 部分正在不同的帐户下运行,并且它缺乏对数据库的权限。检查 Sql Server 的日志以了解失败的登录尝试。

标签: sql powershell visual-studio-2012 tfs continuous-deployment


【解决方案1】:

更新:

在构建过程中,它首先将源(.sql 文件)获取到代理机器。它与在代理机器上运行 PS 脚本时设置的变量 "$env:BUILD_REPOSITORY_LOCALPATH/Queries/GetProjects.sql" 一起使用。

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


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

  1. 在您的 PowerShell 脚本中修改 GetProjects.sql 文件路径 在你的项目结构上是这样的:(见截图示例)

    $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
  1. 添加构建代理服务帐号(默认服务帐号 应该是 NT AUTHORITY\NETWORK SERVICE 如果你没有改变它) 作为具有登录和查询权限的数据库(“MyDB”)用户。

  2. 转到数据库 >> 安全性 >> 用户并右键单击 NT AUTHORITY\NETWORK SERVICE 并选择属性

  3. 在新打开的登录属性屏幕中,转到 “会员资格”标签。在下方屏幕上,检查角色 db_owner。点击确定。

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

【讨论】:

  • @Barani 您是否通过上述解决方法解决了您的问题?有什么更新吗?
  • 谢谢安迪。它没有解决问题。实际上,powershell 脚本是针对不同的机器的。似乎该本地计算机中需要实际文件,而不是环境变量。对于目标机器中的 PS,我们需要提供实际路径。由于文件是在目标机器上执行的,所以我使用了SQL的相对路径并且能够实现。
  • @Barani 我更新了答案,实际上在构建过程中它会首先将源(.sql 文件)获取到代理机器。设置了变量“$env:BUILD_REPOSITORY_LOCALPATH/Queries/GetProjects.sql”,它在我身边运行良好。如果您的意思是您需要在其他机器(不是代理机器)上运行 PS 脚本,因为您必须先将脚本复制到该机器,并在脚本中指定实际路径。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-10
  • 2013-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-16
  • 2012-07-24
相关资源
最近更新 更多