为 SQL Server LocalDB 创建永久别名

Creating a permanent alias for SQL Server LocalDB

我正在尝试为 Microsoft SQL Server 的 LocalDB 设置一个别名,但是用于 link 我正在为 LocalDB 实例创建的别名的命名管道每次我更改时都会发生变化命名实例被实例化。有没有办法为 LocalDB 的实例设置永久别名?

例如,我从名为 'MSSQLLocalDB' 的命令行创建了一个 LocalDB 实例。

sqllocaldb create mssqllocaldb

然后我们启动它并询问信息。

sqllocaldb start mssqllocaldb
sqllocaldb info mssqllocaldb

Name:               mssqllocaldb

Version:            11.0.2318.0

Shared name:

Owner:              COOLNEATRADFOLDER\ryguy

Auto-create:        No

State:              Running

Last start time:    4/9/2018 3:46:16 PM

Instance pipe name: np:\.\pipe\LOCALDB#4329652A3\tsql\query

使用 Microsoft 的计算机管理工具,我们可以创建一个别名:引用我们使用从上一个命令获得的命名管道创建的 LocalDB 实例。

问题是每次创建数据库实例时都会重命名命名管道,而且似乎不支持 TCIP。每次重新启动服务器时(计算机重新加载、超时或手动),都必须以同样的方式完成创建别名的繁琐步骤。

我在这个有用的指导下研究了使用 powershell 脚本 link:

https://social.msdn.microsoft.com/Forums/azure/en-US/a69366e6-3270-4562-afa4-84b5a08a612b/setup-a-permanent-alias-for-localdb?forum=sqldatabaseengine

但这需要一点技巧,而且解决方案有点问题(你必须直接弄乱注册表)。

是否有更简单的方法为 LocalDB 实例创建永久别名?

这是我找到的为 MS SQL LocalDB 实例创建永久别名的解决方案。我调用了我的实例 'mssqllocaldb'。 Thios 解决方案适用于 LocalDB 2012 和 2016。我使用的是 SSMS 2017。

经过多次审查,我得出的结论是 Microsoft 不支持创建连接到 LocalDB 的永久别名。所以我写了一个可以运行轻松的powershell脚本。我把它放在我的桌面上,运行 当我想启动我的数据库时它。

第一段代码提升了 powershell 中的权限,因此该脚本可以破解注册表。

接下来我们启动我们的数据库并解析 sqllocaldb info 命令以获取为此 LocalDB 实例创建的命名管道。

最后我们修改注册表以将别名应用于 64 位和 32 位版本。

使用此脚本将文本文件另存为 'whatever.ps1'。每次要启动数据库时右击select'Run With Powershell'

# Self-elevate the script if required
if (-Not ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] 'Administrator')) {
 if ([int](Get-CimInstance -Class Win32_OperatingSystem | Select-Object -ExpandProperty BuildNumber) -ge 6000) {
  $CommandLine = "-File `"" + $MyInvocation.MyCommand.Path + "`" " + $MyInvocation.UnboundArguments
  Start-Process -FilePath PowerShell.exe -Verb Runas -ArgumentList $CommandLine
  Exit
 }
}


[CmdletBinding()]


$Name = "LocalDBAlias"
$SQLServerName = "mssqllocaldb"

sqllocaldb start mssqllocaldb

$ThePipe = ((sqllocaldb info mssqllocaldb | Select-String -Pattern "np") -split ":")[2]

$hive = "localmachine"

$key = "SOFTWARE\Microsoft\MSSQLServer\Client\ConnectTo"
$key32 = "SOFTWARE\WOW6432Node\Microsoft\MSSQLServer\Client\ConnectTo"

$reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey([Microsoft.Win32.RegistryHive]$hive, $env:COMPUTERNAME)


$subkey = $reg.OpenSubKey($key, $true)
$subkey32 = $reg.OpenSubKey($key32, $true)


$res = $subkey.GetValue($Name)
$res32 = $subkey32.GetValue($Name)

$CurrentPipe = ($res -split ",")[1]


if ($CurrentPipe -eq $ThePipe)
{
    Write-Output "The $Name alias' named pipes match the current instance of mssqllocaldb."
}
else 
{
    $subkey.SetValue($Name,"DBNMPNTW,$ThePipe")
    $subkey32.SetValue($Name,"DBNMPNTW,$ThePipe")
    Write-Output "The $Name alias for MSSQLLocalDB has been set."
}


$reg.Close()

希望对您有所帮助!如果我遗漏了任何信息或者您有任何其他问题,请告诉我。