Пользовательские экземпляры SQL Server, экспресс-выпуск

Выпуск Microsoft SQL Server Express Edition (SQL Server Express) поддерживает пользовательский экземпляр, который доступен только при использовании поставщика данных .NET Framework для SQL Server (SqlClient). Пользовательский экземпляр — это отдельный экземпляр ядра СУБД SQL Server Express, созданный родительским экземпляром. С помощью пользовательских экземпляров пользователи, не являющиеся администраторами на локальных компьютерах, могут присоединяться базы данных SQL Server Express и подключаться к ним. Каждый экземпляр выполняется в контексте безопасности отдельного пользователя на основе модели "один экземпляр на пользователя".

Возможности пользовательского экземпляра

Экземпляры пользователей полезны для пользователей, работающих под управлением Windows под учетной записью пользователя с минимальными привилегиями (LUA). У каждого пользователя есть права системного администратора SQL Server (sysadmin) на экземпляре, работающем на компьютере, без необходимости работать администратором Windows. Программное обеспечение, выполняемое в пользовательском экземпляре с ограниченными разрешениями, не может вносить изменения на уровне системы, так как экземпляр SQL Server Express работает под учетной записью пользователя Windows без прав администратора, а не как служба. Каждый пользовательский экземпляр изолирован от родительского и любых других пользовательских экземпляров, выполняющихся на том же компьютере. Базы данных, запущенные в пользовательском экземпляре, открываются только в однопользовательском режиме. Таким образом несколько пользователей не могут подключаться к базам данных, запущенным в пользовательском экземпляре. Репликация и распределенные запросы также отключены для пользовательских экземпляров.

Примечание.

Пользовательские экземпляры не требуются для пользователей, которые уже являются администраторами на своих компьютерах, или для сценариев, включающих несколько пользователей базы данных.

Включение пользовательских экземпляров

Для создания пользовательских экземпляров требуется запуск родительского экземпляра SQL Server Express. Пользовательские экземпляры по умолчанию включаются, если установлен SQL Server Express, и они могут быть явно включаться или отключаться системным администратором, выполняющим системную хранимую процедуру sp_configure в родительском экземпляре.

-- Enable user instances.  
sp_configure 'user instances enabled','1'
  
-- Disable user instances.  
sp_configure 'user instances enabled','0'  

Для пользовательских экземпляров поддерживается только сетевой протокол локальных именованных каналов. Пользовательский экземпляр невозможно запустить на удаленном экземпляре SQL Server, а учетные данные SQL Server запрещено использовать.

Соединение с пользовательским экземпляром

Ключевые слова User Instance и AttachDBFilenameConnectionString разрешают подключение SqlConnection к пользовательскому экземпляру. Пользовательские экземпляры также поддерживаются свойствами SqlConnectionStringBuilderUserInstance и AttachDBFilename.

Обратите внимание на следующие сведения о приведенном ниже примере строки подключения.

  • Ключевое слово Data Source относится к родительскому экземпляру SQL Server Express, создающему пользовательский экземпляр. Экземпляр по умолчанию — .\sqlexpress.

  • Integrated Security задан как true. Для подключения к пользовательскому экземпляру требуется проверка подлинности Windows. Учетные данные SQL Server не поддерживаются.

  • User Instance имеет значение true. В этом случае вызывается пользовательский экземпляр. (Значение по умолчанию — false.)

  • Ключевое слово строки подключения AttachDbFileName используется для приподключения файла базы данных-источника (MDF) и должно включать полный путь. AttachDbFileName также соответствует ключам "Расширенные свойства" и "Исходное имя файла" в строке подключения SqlConnection.

  • Строка подстановки |DataDirectory|, заключенная в символы вертикальной черты, ссылается на каталог данных приложения, открывающего подключение, и предоставляет относительный путь, указывающий расположение файлов базы данных и журнала MDF и LDF. Если вы хотите разместить эти файлы в других расположениях, необходимо указать полный путь к ним.

Data Source=.\\SQLExpress;Integrated Security=true;  
User Instance=true;AttachDBFilename=|DataDirectory|\InstanceDB.mdf;  
Initial Catalog=InstanceDB;  

Примечание.

Для создания строки подключения во время выполнения можно также использовать свойства SqlConnectionStringBuilderUserInstance и AttachDBFilename.

Использование |DataDirectory| Строка подстановки

Свойство AttachDbFileName в ADO.NET 2.0 было расширено, в нем появилась строка подстановки |DataDirectory| (заключается в символы прямой черты). Строка подстановки DataDirectory в сочетании со свойством AttachDbFileName позволяет указать относительный путь к файлу данных, тем самым позволяя разработчикам создавать строки соединения относительно пути к источнику данных.

Физическое расположение, на которое указывает DataDirectory, зависит от типа приложения. В этом примере вкладываемый файл Northwind.mdf находится в папке \app_data приложения.

Data Source=.\\SQLExpress;Integrated Security=true;  
User Instance=true;  
AttachDBFilename=|DataDirectory|\app_data\Northwind.mdf;  
Initial Catalog=Northwind;  

При использовании DataDirectory путь к результирующему файлу не может быть выше в структуре каталога, чем каталог, на который указывает строка подстановки. Например, если полностью развернутая строка DataDirectory — C:\AppDirectory\app_data, то показанный выше пример строки подключения подойдет, так как он ниже c:\AppDirectory. Но попытка задать DataDirectory как |DataDirectory|\..\data завершится ошибкой, потому что \data не является подкаталогом \AppDirectory.

Если строка подключения имеет неверно отформатированную строку подстановки, будет вызвано исключение ArgumentException.

Примечание.

System.Data.SqlClient разрешает строки подстановки в полные пути в файловой системе локального компьютера. Исходя из сказанного выше, имена путей удаленного сервера, HTTP и UNC не поддерживаются. Если сервер не находится на локальном компьютере, во время открытия подключения вызывается исключение.

При открытии подключения SqlConnection оно перенаправляется с экземпляра SQL Server Express по умолчанию на экземпляр, запущенный во время выполнения, который выполняется под учетной записью вызывающего объекта.

Примечание.

В некоторых случаях может потребоваться увеличить значение ConnectionTimeout, так как для загрузки пользовательских экземпляров может потребоваться больше времени, чем для обычных экземпляров.

Следующий фрагмент кода открывает новый объект SqlConnection, отображает строку подключения в окне консоли, а затем закрывает подключение при выходе из блока кода using.

Private Sub OpenSqlConnection()  
    ' Retrieve the connection string.  
    Dim connectionString As String = GetConnectionString()  
  
    Using connection As New SqlConnection(connectionString)  
        connection.Open()  
        Console.WriteLine("ConnectionString: {0}", _  
           connection.ConnectionString)  
    End Using  
End Sub  
private static void OpenSqlConnection()  
{  
    // Retrieve the connection string.  
    string connectionString = GetConnectionString();  
  
    using (SqlConnection connection =
        new SqlConnection(connectionString))  
    {  
        connection.Open();  
        Console.WriteLine("ConnectionString: {0}",
             connection.ConnectionString);  
    }  
}  

Примечание.

Пользовательские экземпляры не поддерживаются в коде среды CLR, который выполняется в SQL Server. Если для объекта SqlConnection, в котором в строке подключения указано значение User Instance=true, вызывается Open, выдается исключение InvalidOperationException.

Время существования соединения пользовательского экземпляра

В отличие от версий SQL Server, которые запускаются как службы, экземпляры SQL Server Express не нужно запускать и останавливать вручную. Каждый раз, когда пользователь входит в систему и подключается к пользовательскому экземпляру, экземпляр запускается, если он еще не запущен. Для баз данных пользовательских экземпляров задан параметр AutoClose. Это позволяет автоматически завершать работу базы данных по истечении периода бездействия. Запущенный процесс sqlservr.exe выполняется в течение ограниченного времени ожидания после закрытия последнего подключения с экземпляром. Таким образом его не нужно перезапускать при открытии другого подключения до истечения времени ожидания. Пользовательский экземпляр автоматически завершает работу, если до истечения времени ожидания не будет открыто новое подключение. Администратор системы на родительском экземпляре может устанавливать длительность времени ожидания для пользовательского экземпляра при помощи процедуры sp_configure, которая изменяет параметр user instance timeout. Значение по умолчанию — 60 минут.

Примечание.

Если в строке подключения используется Min Pool Size со значением больше нуля, то пул подключений всегда будет поддерживать несколько открытых подключений, и пользовательский экземпляр не завершит работу автоматически.

Работа пользовательских экземпляров

При первом создании пользовательского экземпляра для любого пользователя системные базы данных master и msdb копируются из папки Template Data в локальный пользовательский каталог-репозиторий для монопольного использования пользовательским экземпляром. Этот путь обычно выглядит следующим образом: C:\Documents and Settings\<UserName>\Local Settings\Application Data\Microsoft\Microsoft SQL Server Data\SQLEXPRESS. При запуске пользовательского экземпляра база данных tempdb журнал и файлы трассировки также записываются в этот каталог. Для экземпляра создается имя, которое гарантированно будет уникальным для каждого пользователя.

По умолчанию всем участникам группы Builtin\Users Windows предоставляются разрешения на подключение к локальному экземпляру, а также разрешения на чтение и выполнение для двоичных файлов SQL Server. После проверки учетных данных вызывающего пользователя, размещающего пользовательский экземпляр, этот пользователь станет sysadmin на этом экземпляре. Для пользовательских экземпляров включена только общая память, то есть возможны только операции на локальном компьютере.

Пользователи должны иметь разрешения на чтение и запись для файлов MDF и LDF, указанных в строке подключения.

Примечание.

MDF и LDF представляют файлы базы данных и журнала соответственно. Эти два файла являются сопоставленным набором. Таким образом во время операций резервного копирования и восстановления необходимо соблюдать осторожность. Файл базы данных содержит сведения о точной версии файла журнала. База данных не будет открываться, если она связана с неверным файлом журнала.

Чтобы избежать повреждения данных, база данных в пользовательском экземпляре открывается с монопольным доступом. Если два разных пользовательских экземпляра совместно используют одну и ту же базу данных на одном компьютере, пользователь первого экземпляра должен закрыть базу данных, прежде чем ее можно будет открыть во втором экземпляре.

Сценарии пользовательских экземпляров

Пользовательские экземпляры предоставляют разработчикам приложений баз данных хранилище данных SQL Server. Это хранилище не зависит от разработчиков, имеющих административные учетные записи на компьютерах разработки. Пользовательские экземпляры основаны на модели Access/Jet, где приложение базы данных просто подключается к файлу и пользователь автоматически получает полный набор разрешений на все объекты базы данных без необходимости предоставления разрешений администратором. Эта модель предназначена для ситуаций, когда пользователь работает с учетной записью с минимальными правами (LUA) и не имеет прав администратора на сервере или на локальном компьютере, но требует создания объектов базы данных и приложений. Благодаря пользовательским экземплярам пользователи могут создавать экземпляры во время выполнения, которые запускаются в собственном контексте безопасности, а не в контексте безопасности более привилегированной системной службы.

Внимание

Пользовательские экземпляры следует использовать только в сценариях, где все использующие их приложения являются полностью доверенными.

Ниже приведены поддерживаемые сценарии пользовательских экземпляров.

  • Любое приложение с одним пользователем, в котором не требуется совместное использование данных.

  • Развертывание ClickOnce. Если платформа .NET Framework 2.0 (или более поздней версии) и SQL Server Express уже установлены на целевом компьютере, пакет установки, скачанный в результате действия ClickOnce, можно установить и использовать пользователями без администратора. Обратите внимание, что администратор должен установить SQL Server Express, если он является частью процесса установки. Дополнительные сведения см. в статье ClickOnce Deployment for Windows Forms (Развертывание ClickOnce для Windows Forms).

  • Выделенное размещение ASP.NET с использованием проверки подлинности Windows. В интрасети может размещаться один экземпляр SQL Server Express. Приложение подключается с помощью учетной записи ASP.NET Windows, а не с использованием олицетворения. Пользовательские экземпляры не следует использовать для сценариев сторонних разработчиков или совместного размещения, где все приложения совместно используют один пользовательский экземпляр и больше не изолированы друг от друга.

См. также