【问题标题】:MSSQl 'GO' handling in Powershell connection StringPowershell 连接字符串中的 MSSQl 'GO' 处理
【发布时间】:2019-04-08 17:36:39
【问题描述】:

我有一个用Go 修补的sql 查询来检查mssql 中的孤立对象。

use DBName
go
sp_change_users_login 'report'

现在,我在 Powershell 中为所有用户数据库自动执行上述操作,并尝试获取孤儿用户。

代码如下:

        if($port)
        {
        $connectionString ="server=$servername,$port;Integrated Security=true;" #uid=$DBUserName; pwd=$dbpwd;Database=$DB;
        }
        else
        {
        $connectionString ="server=$servername;Integrated Security=true;" 
        }
        $connection = New-Object System.Data.SqlClient.SqlConnection -ea Stop
        $connection.ConnectionString=$connectionString
        $connection.Open()

        $db_query = @"
        Select name from sys.sysdatabases where dbid > 4 and name not in ('ReportServer')
"@
        $command = $connection.CreateCommand()
        $command.CommandText = $db_query
        $result = $command.ExecuteReader()
        $object= New-Object System.Data.DataTable
        $object.Load($result)
        [System.Array]$DBs = $object.name

        if($DBs -is [System.Array])
        {
            foreach($DB in $DBs)
            {
            ## PROBLEM IS HERE ###
              $orphan_users_query = @"

                use $DB
                GO
                sp_change_users_login 'report'

"@
        $command = $connection.CreateCommand()
        $command.CommandText = $orphan_users_query
        $result = $command.ExecuteReader()
        $object= New-Object System.Data.DataTable
        $object.Load($result)
        $object | Out-File C:\temp\outfile_property.txt -Append -Force
            }
        }

问题是 PS 无法识别 go 分隔符,因为它特定于 MSSQL/SSMS。那么,我怎样才能在所有用户数据库中迭代和运行查询,而不创建特定于每个数据库的多个连接?

【问题讨论】:

    标签: sql-server powershell


    【解决方案1】:

    在连接上调用ChangeDatabase 是切换数据库的另一种方法。

    然后您可以按原样执行sp_change_users_login。不需要GO

    【讨论】:

    • 不幸的是,我真的希望避免使用连接字符串更改数据库,并希望在 sql 查询中处理它。有没有其他进步的方法?如果处理了更改数据库,那么我可以像您所说的那样完全忽略 Go。
    • @RanadipDutta - 我不明白反对意见。它实际上只是$connection.ChangeDatabase($DB)
    • 问题是产品负责人有点想避免它:P。没有其他的。无论如何,我会接受这个答案,因为它是有道理的。
    猜你喜欢
    • 1970-01-01
    • 2012-12-29
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    相关资源
    最近更新 更多