Создание постоянного псевдонима для SQL Server LocalDB

Я пытаюсь настроить псевдоним для Microsoft SQL Server LocalDB, но именованные каналы, которые используются для связи создаваемого мной псевдонима с экземпляром LocalDB, изменяются каждый раз, когда создается экземпляр моего именованного экземпляра. Есть ли способ настроить постоянный псевдоним для экземпляра LocalDB?

Например, я создал экземпляр LocalDB из командной строки под названием «MSSQLLocalDB».

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 с помощью этой полезной ссылки:

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

Но это требует немного хака, и решение немного глючное (приходится напрямую возиться с реестром).

Есть ли более простой способ создать постоянный псевдоним для экземпляра LocalDB?


person Ryan Richardson    schedule 09.04.2018    source источник


Ответы (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()

Я надеюсь, что вы нашли это полезным! Дайте мне знать, если я упустил какую-либо информацию или если у вас есть дополнительные вопросы.

person Ryan Richardson    schedule 14.04.2018