AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 77872
Accepted
SQL Hammer
SQL Hammer
Asked: 2014-09-28 18:17:17 +0800 CST2014-09-28 18:17:17 +0800 CST 2014-09-28 18:17:17 +0800 CST

PowerShell SQLPS SQLSERVER 提供程序如何检测 SQLRegistration\Central Management Server Group 中的中央管理服务器

  • 772

我在使用 PowerShell SQLSERVER 提供程序和 SQLRegistration\Central Management Server Group 目录时遇到了奇怪的行为。以下是行为。我想知道 SQLSERVER 提供程序如何知道注册了哪些 CMS,以便我可以理解为什么它在 SSMS 2014 中完成时似乎没有注意到注册(有关详细行为,请参见下文)。另外,当我知道实例在线时,为什么我的连接失败。

安装
机

  • 本地主机

实例

  • 本地主机\SQL2012
  • 本地主机\SQL2014
  • 本地主机\SQL2014_1

行为 1
使用 SSMS 2014,我将 localhost\SQL2012 注册为 CMS。执行此代码不会返回任何项目。

PS SQLSERVER:\SQLRegistration\Central Management Server Group> dir

打开和关闭 PowerShell 控制台,SSMS 不会改变结果。如果我打开 SSMS 2012 并将 localhost\SQL2012 注册为 CMS 并重新运行上述命令,我会看到 localhost\SQL2012 按预期注册。

行为 2
让服务器成功列出后...

目录:Microsoft.SqlServer.Management.PSProvider\SqlServer::SQLSERVER:\SQLRegistration\Central Management Server Group

模式名称


  • 本地主机\SQL2012

并且运行以下命令以尝试导航到我注册的服务器组失败并出现以下错误,即使实例在线且可用。

PS SQLSERVER:\SQLRegistration\Central Management Server Group> Set-Location "localhost\SQL2012\"  

设置位置:找不到路径“SQLSERVER:\SQLRegistration\Central Management Server Group\localhost\SQL2012\”,因为它不存在。在 line:1 char:1 + Set-Location "localhost\SQL2012\" + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~ + CategoryInfo : ObjectNotFound: (SQLSERVER:\SQLR...alhost\SQL2012:String) [Set-Location], ItemNotFoundE xception + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.SetLocationCommand

更新 1
SMO 似乎工作正常。以下代码成功返回我的服务器组。

#Load SMO assemblies
$CentralManagementServer = "localhost\sql2012"
$MS='Microsoft.SQLServer'
@('.SMO', '.Management.RegisteredServers', '.ConnectionInfo') |
     foreach-object {if ([System.Reflection.Assembly]::LoadWithPartialName("$MS$_") -eq $null) {"missing SMO component $MS$_"}}

$connectionString = "Data Source=$CentralManagementServer;Initial Catalog=master;Integrated Security=SSPI;"
$sqlConnection = new-object System.Data.SqlClient.SqlConnection($connectionString)
$conn = new-object Microsoft.SqlServer.Management.Common.ServerConnection($sqlConnection)
$CentralManagementServerStore = new-object Microsoft.SqlServer.Management.RegisteredServers.RegisteredServersStore($conn)

$CentralManagementServerStore.ServerGroups[ "DatabaseEngineServerGroup" ].ServerGroups
sql-server powershell
  • 2 2 个回答
  • 5848 Views

2 个回答

  • Voted
  1. SQL Hammer
    2014-09-30T16:33:55+08:002014-09-30T16:33:55+08:00

    肖恩关于 SQL Server 版本之间差异的解释似乎是有针对性的。因此,我认为 SMO 是一种更稳定的方法。我将使用下面的代码继续前进。

    Import-Module SQLPS -DisableNameChecking
    
    Function Parse-ServerGroup($serverGroup)
    {
        $results = $serverGroup.RegisteredServers;
        foreach($group in $serverGroup.ServerGroups)
        {
            $results += Parse-ServerGroup -serverGroup $group;
        }
        return $results;
    }
    
    Function Get-ServerList ([string]$cmsName, [string]$serverGroup, [switch]$recurse)
    {
    
        $connectionString = "data source=$cmsName;initial catalog=master;integrated security=sspi;"
    $sqlConnection = New-Object ("System.Data.SqlClient.SqlConnection") $connectionstring
        $conn = New-Object ("Microsoft.SQLServer.Management.common.serverconnection") $sqlconnection
        $cmsStore = New-Object Microsoft.SqlServer.Management.RegisteredServers.RegisteredServersStore($conn)
        $cmsRootGroup = $cmsStore.ServerGroups["DatabaseEngineServerGroup"].ServerGroups[$serverGroup]
    
        if($recurse)
        {
            return Parse-ServerGroup -serverGroup $cmsRootGroup | select ServerName
        }
        else
        {
            return $cmsRootGroup.RegisteredServers | select ServerName
        }
    }
    
    Get-ServerList -cmsName "localhost\SQL2012" -serverGroup "Production" -recurse | Format-Table
    
    • 2
  2. Best Answer
    user507
    2014-09-29T11:56:11+08:002014-09-29T11:56:11+08:00

    行为 1 我可以预期,因为在较低版本的实例上使用较高版本的 SSMS 时,某些功能可能会或可能不会按预期工作。从 2014 年到 2012 年,背景中可能发生了一些细微的变化,您可能永远找不到任何文档。如果您每次都可以在另一台机器上重新创建此场景,我实际上会在此创建一个连接项。

    现在,行为 2 在我第一次尝试时失败,但之后每次都成功,即使在打开/关闭窗口之后也是如此。但是,如果您仅使用PowerShell.exe它来尝试此操作,那么当您与提供者打交道时,预计某些事情将不会以完全相同的方式发挥作用SQLPS。如果您尝试在其中执行相同的命令,SQLPS.exe我希望它每次都能正常工作,至少对我有用。现在我没有使用 SQL Server 2014,现在我的机器上只加载了 2012。

    您可以通过比较每个加载的程序集来了解差异PowerShell.exe和差异的事实:SQLPS.exe

    在此处输入图像描述

    • 1

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve