我的任务是发现在我们的域中运行的所有 SQL Server 实例。在某些情况下,每个服务器有多个实例。我见过两种不同的 PowerShell 方法来查找这些实例,但似乎都没有找到所有实例。
1) 使用 WMI
$srvr = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer $computerName
$instances = $srvr | ForEach-Object {$_.ServerInstances} | Select @{Name="fullName";Expression={$computerName +"\"+ $_.Name}}
return $instances
Run Code Online (Sandbox Code Playgroud)
2)使用远程注册表(与 Get-SQLInstance 1 一样)
我遇到的最大问题是,并非我所知道的所有服务器都使用 SQL Server WMI 提供程序运行,也不是所有服务器都允许远程注册。有没有第三种方法?我可以使用远程桌面访问所有服务器,但我正在查看大约 30 台机器,并希望尽可能避免手动步骤。这仅需要适用于 SQL Server 2008 及更高版本,虽然了解其他 SQL Server 服务 (SSIS/SSAS/SSRS) 会很好,但我主要关注 SQL Server 本身。
TL;DR:当通过解析为 IPv6 环回 ( ::1)的名称连接到我的 SQL Server Docker 容器时,SMO 调用真的很慢。使用时127.0.0.1,它们很快。
我正在尝试学习如何使用 Docker 映像microsoft/mssql-server-windows-developer。根据 Microsoft 的文档,此容器仅公开端口 1433 TCP。
docker run -d -p 1433:1433 -e sa_password=Passw0rd! -e ACCEPT_EULA=Y -v C:\dockerdb:C:\dockerdb microsoft/mssql-server-windows-developer
Run Code Online (Sandbox Code Playgroud)
我在 Windows 10 上运行容器,并已成功启动它,使用 SQL Server 身份验证进行身份验证,并在 Windows 主机上使用 sqlcmd 和 SSMS 17.4(连接到本地主机或“.”)和 SQL 操作对实例运行查询隔壁 Mac 上的 Studio 通过 IP 连接。以这种方式运行查询时,我看不到明显的性能问题。
在 SSMS 中,我也可以浏览对象资源管理器,但是如果我尝试从对象资源管理器中的对象的右键单击菜单中执行某些操作,例如打开实例参数窗口或附加数据库,SSMS 不会显示大约 5 次响应-10 分钟,此时它要么显示我要求的窗口,要么显示以下错误消息:
我还尝试使用 SMO Scripter object 对该实例执行一些PowerShell 脚本,并查看相同类型的行为。PS 脚本循环遍历数据库中的对象并将它们编写到文件中,虽然它可以相对较快地收集对象列表,但每个单独的对象需要 5-10 分钟来编写脚本 — 太慢而无法使用。
我有一种预感,单个暴露的端口是不够的,SMO 和 …
我正在尝试读取 winforms C# 应用程序中表和列的扩展属性。我正在使用 SQL Server SMO 来执行此操作。当我执行应用程序时,它看不到扩展属性,但是当我使用 PowerShell 读取扩展属性时,它确实看到了扩展属性。
C# 代码:
var x = col.ExtendedProperties.Count;
var NPI = col.ExtendedProperties["NPI"].Value;
bool npi = bool.Parse(NPI.ToString());
Run Code Online (Sandbox Code Playgroud)
PowerShell 代码:
Add-Type -AssemblyName "Microsoft.SqlServer.Smo, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"
$server = New-Object Microsoft.SqlServer.Management.Smo.Server $env:COMPUTERNAME
$server.Databases["<db name>"].Tables["<table name>"].Columns["<column name>"].ExtendedProperties | Select Name, Value, State
Run Code Online (Sandbox Code Playgroud)
我已经检查过,Visual Studio 和 PowerShell 都使用相同版本的 SMO (11.0.0.0)。当我执行 C# 代码时 col.ExtendedProperties.Count = 0,但是当我执行 PowerShell 代码时,我得到:
Name Value State
---- ----- -----
NPI False Existing
Run Code Online (Sandbox Code Playgroud)
有没有人对为什么会发生这种情况有任何想法?
在 C# 代码中,我使用以下方法在表上打开了一个 DataReader:
sourceServer.ConnectionContext.ExecuteReader(<select command>)
Run Code Online (Sandbox Code Playgroud)
从表中检索数据。然后我使用 DataReader 进入一个 …
我最近一直在使用 SMO 来检查一些属性,并且在尝试收集有关 SQL Server 2016 中的读取路由顺序的信息时遇到了一个问题。
在早期版本中,路由列表非常简单,列表将按顺序处理,但在 2016 年,他们引入了循环算法,允许您让多个辅助副本接受读取流量。
虽然此数据可通过 T-SQL 访问,但 SMO 似乎并未更新以反映这一点,这意味着您无法准确获取或设置配置,因为它仍然是一个简单的字符串集合。
是否有一些我遗漏的属性可以让我获得 SQL Server 2016 的准确数据?(下面的 C# 示例 SMO 调用)
它只是似乎无法访问的循环信息,它列出了读取路由列表中的所有副本,它似乎没有区分可能存在的各种副本组。
连接错误报告。 连接已死...
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;
namespace SmoTesting
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Enter the servername");
string connectServer = Console.ReadLine();
Console.WriteLine("Enter the AG name");
string agName = Console.ReadLine();
Server srv = new Server();
try
{
srv = new Server(connectServer);
srv.ConnectionContext.StatementTimeout = …Run Code Online (Sandbox Code Playgroud) 我想我刚刚找到了 SQL Server SMO 和 PowerShell 最酷的东西。我被要求编写一个脚本来查找 SQL Server 实例中每个对象的所有者。我在 Technet/MSDN SQL Server 库上找到了一个脚本,但认为使用 PowerShell 获取它会容易得多,并且能够一次访问网络上的所有实例。
在玩的过程中,我在 Database 类中遇到了这个方法:Discover()
因此,如果您使用此代码:
#Load SMO
[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.Smo') | Out-Null
$srv = New-Object 'Microsoft.SqlServer.Management.Smo.Server' "your instance name"
$db = $srv.Databases
$db.Discover()
Run Code Online (Sandbox Code Playgroud)
当你运行最后一行时,如果你连接到一个有很多数据库的实例,你会看到你的控制台开始滚动文本,就像它在药物上一样。
好吧,我去做了 $db | gm ,它几乎向您展示了 SMO 对象中可用的每个 TypeName。
现在我的问题。我可以执行$db.Discover() | Select Name, Owner,它将开始吐出带有名称和所有者值的所有内容。
我怎样才能获得返回对象的对象类型(比如它是触发器、模式、表等)?到目前为止,我似乎无法弄清楚。
编辑
到目前为止,我发现它似乎只能在数据库级别“发现”事物。显然,我在控制台缓存中的某个地方设置 $db了类似$db = ($srv.Databases).Item("aDatabase"),因为这是您可以调用该方法的唯一方法。尽管如此,仍在寻找一种方法来提取对象名称、类型和所有者。
我希望能够从 Windows 命令提示符将给定数据库的架构脚本写入 .sql 文件。基本上,我想以编程方式执行 Management Studio 的“生成脚本”功能。
我知道使用 .NET 和 SMO 可以做到这一点,但是是否有内置的东西可以做到这一点?
这个问题的背景:这是一个简单的审计工具。我们希望每晚都捕获模式。任何原始的、低技术的解决方案都适合我们。
我们的 OLTP 日志系统的其中一个表中的 ID 即将用完。我的工作是找到一种方法来“归档”完整表和所有引用表中的现有行数据,以便我们可以继续将新数据记录到表中。
我们在一个表中归档数据的最快方法是简单地重命名目标表和所有依赖对象——联结表、索引、约束。它速度很快,并且可以保持数据完整。为了完成这项工作,我们必须使用旧名称创建所有对象的新的空副本。如果我们在一个事务中完成所有这些操作,插入新数据的存储过程不会因为缺少表而失败。
我已经整理了一个 PowerShell 脚本来生成一个 T-SQL 脚本来执行存档操作。
该脚本没有生成应有的重命名语句,我不明白为什么。
该脚本加载 SMO,设置目标对象的名称,并设置到服务器的仅捕获连接 - 这样我就可以捕获重命名命令以供稍后检查:
Add-Type -AssemblyName "Microsoft.SqlServer.Smo, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91";
$ServerName = 'CLOUDCORP\LOGGING'
$DatabaseName = 'Logging'
$TableName = 'tbDataRequests'
$TableSchemaName = 'Logging'
$Server = New-Object Microsoft.SqlServer.Management.Smo.Server $ServerName
$Server.ConnectionContext.SqlExecutionModes = [Microsoft.SqlServer.Management.Common.SqlExecutionModes]::CaptureSql
Run Code Online (Sandbox Code Playgroud)
接下来,它创建一个将通过重命名存档的对象数组。目标表本身、所有引用表以及这些表的所有键和所有索引都将被归档:
$Database = $Server.Databases[$DatabaseName]
$Table = @($Database.Tables[$TableName, $TableSchemaName])
$ReferencingTables = $Database.Tables.ForeignKeys |
? { $_.ReferencedTable -eq $TableName -and $_.ReferencedTableSchema -eq $TableSchemaName } |
% { $_.Parent } | Sort ID | Get-Unique
$TablesToArchive = …Run Code Online (Sandbox Code Playgroud) 我特别想要一种可编程方式来更改服务器上所有数据库的恢复模型,并且我知道此解决方案可以应用于所有“更改数据库”命令。虽然我知道 PowerShell 中的 SMO 可以很容易地解决这个问题:
Import-Module SQLPS
CD SQL\*ServerName*\*InstanceName*\databases
foreach ($database in (ls -force)){
$database.recoverymodel = 'Full'
$database.update
}
Run Code Online (Sandbox Code Playgroud)
我正在寻找最有效的 T-SQL 解决方案。不惜一切代价避免使用游标已经在我的脑海中根深蒂固,但是我想不出基于集合的解决方案来执行更改语句。这是基于游标的解决方案。
DECLARE @sql varchar(MAX), @name varchar(50)
DECLARE cur CURSOR FOR
SELECT name
FROM sys.databases
where name <> 'tempdb';
OPEN cur
FETCH NEXT FROM cur
INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = 'ALTER DATABASE ' + @name + ' SET RECOVERY FULL;'
exec(@sql)
FETCH NEXT FROM cur INTO @name
END
CLOSE CUR
DEALLOCATE cur
Run Code Online (Sandbox Code Playgroud)
可以在模型数据库上启用查询存储,并确保每个新数据库都具有与模型数据库相同的设置。
缺少 GUI 选项
但可以使用 TSQL 启用它
ALTER DATABASE model
SET QUERY_STORE = ON (OPERATION_MODE = READ_WRITE);
Run Code Online (Sandbox Code Playgroud)
由于没有 GUI,我无法检查那里的默认设置。
再次使用TSQL
USE model;
select * from sys.database_query_store_options;
Run Code Online (Sandbox Code Playgroud)
返回空结果
当我创建一个新数据库(使用模型作为模板并查询设置时,它会显示结果)
create database TestQs;
go
use TestQs;
select * from sys.database_query_store_options;
Run Code Online (Sandbox Code Playgroud)
此外,设置必须保存在某处,因为当我更改查询存储选项时,更改会传播到新数据库
ALTER DATABASE model
SET QUERY_STORE (INTERVAL_LENGTH_MINUTES = 22);
Run Code Online (Sandbox Code Playgroud)
我尝试过使用 SMO 来找到这些选项,但没有成功。
$SqlServer = New-Object Microsoft.SqlServer.Management.Smo.Server -ArgumentList 'localhost'
$sqlServer.Databases['TestQs'].QueryStoreOptions
Run Code Online (Sandbox Code Playgroud)
但对模型数据库进行相同的查询不会产生任何结果
$SqlServer = New-Object Microsoft.SqlServer.Management.Smo.Server -ArgumentList 'localhost'
$sqlServer.Databases['model'].QueryStoreOptions
Run Code Online (Sandbox Code Playgroud)
有没有一种方法可以检查模型数据库上的查询存储设置,而无需创建新数据库并在那里进行检查?
我可能已经看这个太久了,无法弄清楚这一点......
下面的函数用于提取有关 SQL Server 实例的一个或多个数据库的信息。到目前为止,我知道这适用于 SQL 2005 及更高版本。
我已经使用过,Format-Table但最终会切断列。我使用了Output-Filewhich 可以工作但默认为列表视图,这可能很难进入 Excel。它还会切断超过一定长度的列数据。
编辑:此功能的目的是针对 100 多台服务器运行它以收集每个实例的清单。
PowerShell 功能:
# Load SMO
[void][System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO')
function Get-DatabaseInfo ($server,$dbname)
{
$srv = New-Object 'Microsoft.SqlServer.Management.Smo.Server' $server
$db = $srv.Databases.Item($dbname)
$DataFile = $db | Select -ExpandProperty FileGroups | Select -ExpandProperty Files
$LogFile = $db | Select -ExpandProperty LogFiles
$tables = $db | Select -ExpandProperty tables | ? {$_.IsSystemObject -eq $false}
$indexes = $tables | Select -ExpandProperty Indexes | ? …Run Code Online (Sandbox Code Playgroud) smo ×10
sql-server ×10
powershell ×6
c# ×1
command-line ×1
docker ×1
functions ×1
metadata ×1
performance ×1
query-store ×1
scripting ×1
ssms ×1