为 SQL Server LocalDB 创建永久别名

Posted

技术标签:

【中文标题】为 SQL Server LocalDB 创建永久别名【英文标题】:Creating a permanent alias for SQL Server LocalDB 【发布时间】:2018-04-09 22:45:57 【问题描述】:

我正在尝试为 Microsoft SQL Server 的 LocalDB 设置一个别名,但是每次实例化我的命名实例时,用于将我创建的别名链接到 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

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

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

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

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

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

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

【问题讨论】:

【参考方案1】:

这是我为 MS SQL LocalDB 实例创建永久别名的解决方案。我已将我的实例称为“mssqllocaldb”。 Thios 解决方案适用于 LocalDB 2012 和 2016。我正在使用 SSMS 2017。

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

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

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

最后,我们破解了注册表,将别名应用于 64 位和 32 位版本。

使用此脚本将文本文件保存为“whatever.ps1”。每次要启动数据库时,右键单击并选择“使用 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()

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

【讨论】:

以上是关于为 SQL Server LocalDB 创建永久别名的主要内容,如果未能解决你的问题,请参考以下文章

LocalDB SQL Server 2014 Express 创建 2 个实例 (localdb)\ProjectsV12 & (localdb)\MSSQLLocalDB?

修改 EF的默认连接工厂为 Sql Server 而不是LocalDb

如何在没有 SQL Server Management Studio 的情况下在 SQL Server Express LocalDB 中使用 Visual Studio 2013 创建两个表之间的关

从 LocalDB (.mdf) 文件转换为 SQL Server Express .mdf 文件和反向过程

009.Working with SQL Server LocalDB --在sql server localdb 上操作数据

SQL Server 2012 Express LocalDB