为 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 上操作数据