gpt4 book ai didi

sql - 为什么我通过 Start-Job 执行的 SQL 没有返回我期望的答案?

转载 作者:行者123 更新时间:2023-12-04 21:38:21 24 4
gpt4 key购买 nike

我有一个数据库托管在 SQL Server 2008 上,我的普通用户帐户无权访问。为了查询它,我需要使用我的特殊“管理员”帐户(只是另一个 AD 帐户,但与我的常规用户帐户在不同的组中)。

我想出了一个想法,通过 Start-Job 在 Powershell 中使用后台作业来运行对该数据库的查询,因为您可以使用来自登录用户的不同凭据启 Action 业,因此数据库上的集成安全性可以正常工作。由于我的问题,我今天下午在谷歌上搜索了很多,看到一些人出于同样的原因采用这种方法,但他们的结果似乎确实有效 - 而我的结果却不是出于某种原因。

我有以下powershell代码:

[scriptblock]$sql_block = {
$Query = "select * from some_table"
$CW_DBConnection = New-Object Data.SqlClient.SQLConnection
$CW_DBConnection.ConnectionString = "Data Source=someserver;Initial Catalog=some_database;Integrated Security=SSPI;"
$CW_DBConnection.Open()

$Command = New-Object Data.SqlClient.SqlCommand($Query,$CW_DBConnection)
$Adapter = New-Object Data.SqlClient.SqlDataAdapter
$DataSet = New-Object Data.DataSet

$Adapter.SelectCommand = $Command
[void]$Adapter.Fill($DataSet)

$CW_DBConnection.Close()

return $DataSet
}

我通过以下方式执行:
$mySQLJob = Start-Job -ScriptBlock $sql_block -Credential $(Get-Credential -UserName AD\MyAdminAccount -Message "Enter Admin Password")
Wait-Job $mySQLJob
$results = Receive-Job $mySQLJob

这一切进展顺利。但是,当我来询问结果对象时,我看到了:
$results
RunspaceId : 975030ec-d336-4583-9260-48439bb34292
RemotingFormat : Xml
SchemaSerializationMode : IncludeSchema
CaseSensitive : False
DefaultViewManager : {System.Data.DataViewManagerListItemTypeDescriptor}
EnforceConstraints : True
DataSetName : NewDataSet
Namespace :
Prefix :
ExtendedProperties : {}
HasErrors : False
IsInitialized : True
Locale : en-GB
Site :
Relations : {}
Tables : {System.Data.DataRow}
Container :
DesignMode : False
ContainsListCollection : True

当我尝试进入 Tables 位时:
$results.Tables[0]
System.Data.DataRow

$results.Tables[0].GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True ArrayList System.Object

$results.Tables[0][0]
System.Data.DataRow

$results.Tables[0][0].GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object

从字面上看,结果只是字符串“System.Data.DataRow”。

我上哪儿去了?

注意 - 从实际作为我的 Admin id 执行的 powershell session 运行它而不是通过 Start-Job 执行它(即只执行内联 SQL 位)按预期工作,并且我从数据库中获取了实际数据。

最佳答案

我已经在 Can Powershell Receive-Job return a DataSet? 阅读了问题当我发布这个 - 但显然我没有足够仔细地阅读它 - 因为工作答案返回的不是顶级 DataSet 对象,而是它的 Tables[0] 属性。

今天早上我更改了我的脚本块以返回它,并且瞧,我现在得到了实际的 SQL 数据。

所以看起来 Receive-Job 没有将它返回的对象序列化到足够的深度,你可以返回任意的对象(虽然我猜你可以尝试自己序列化它们 - 我还没有尝试过。更新:见下文)。

所以,总而言之,一行改变

return $DataSet


return $DataSet.Tables[0]

做到了。

更新:我现在尝试了“自己序列化”的方法,这似乎工作正常。因此,首先更新脚本块以在最后执行此操作:
$Serialized_DataSet = [System.Management.Automation.PSSerializer]::Serialize($DataSet,2)
return $Serialized_DataSet

然后当您想要返回结果时:
$results = Receive-Job $mySQLJob
$deserialized_results = [System.Management.Automation.PSSerializer]::Deserialize($results)

然后您可以看到 $deserialized_results.Tables[0] 实际上包含您可以使用的结果。

关于sql - 为什么我通过 Start-Job 执行的 SQL 没有返回我期望的答案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31656542/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com