Возобновляя серию статей, посвящённую новым возможностям SQL Server Denali, я хочу рассказать о Contained Databases. Смысл их довольно прост. Contained Database – база данных, которая не зависит ни от каких серверных объектов. Это гарантирует нам то, что перенеся базу данных на другой сервер, база данных и приложения, работающие с ней, будут продолжать работать точно также, как и на предыдущем сервере.
О каких серверных объектах идёт речь? Как минимум, база данных использует такой объект сервера как логин. И после переноса базы на другой сервер приложение, работающее с базой валится, т.к. разорвана связка логина сервера и пользователя базы данных. Наверняка многие из вас сталкивались с этой ситуацией, и либо восстанавливали связку, либо пересоздавали пользователя. Так вот! Contained Database позволяет решить эту проблему! И если ваша база данных является Contained, то вы можете создавать Contained пользователей, которые хранятся в вашей базе данных вместе с хэшом пароля. Такому пользователю не нужен логин сервера для для аутентификации. Подробнее о аутентификации пользователей в Contained базах данных можно почитать в цикле статей Людмилы Фокиной. В CTP1, кроме поддержки Contained пользователей, есть ещё поддержка Collation базы данных для темповых таблиц. Раньше была такая проблема: Collation временных таблиц устанавливался такой-же, как и в tempdb и операции сравнения строковых данных или джоины таблиц базы данных с временными таблицами не проходили если у базы данных был отличный от tempdb коллэйшн. В Contained Databases эта проблема решена, и временные таблицы создаются с коллэйшном базы данных в контексте которой происходит создание временной таблицы. В будущем ожидается поддержка: Linked серверов, пользовательских сообщений об ошибках, заданий SQL-агента, серверных опций.
Для того, чтобы попробовать Contained Databases первым делом нужно включить их поддержку на уровне сервера. Либо через UI, как на скриншоте, либо с помощью хранимки sp_configure.
Создать Contained базу данных и Contained пользователя можно при помощи следующего скрипта:
CREATE DATABASE MyDatabase CONTAINMENT = PARTIAL
GO
CREATE USER MyUser WITH PASSWORD = 'test'
GO
Здесь ключевое слово CONTAINMENT говорит о том, что база данных будет Contained. У этого параметра 3 значения:
- NONE (обычная база)
- PARTIAL (декларирует возможность создания Contained объектов)
- FULL (полная независимость базы (в CTP1 не поддерживается))
После создания базы и пользователя, можно пробовать залогиниться. При соединении из SSMS, нужно обязательно выбрать базу данных с которой вы соединяетесь:
В противном случае соединение будет устанавливаться по дефолту с базой данных master и вы получите ошибку соединения:
После успешного соединения в Object Explorer вы увидите примерно следующую картину:
Это как раз то, что нужно. Мы видим только базу данных, с которой можем работать, и не видим никаких объектов сервера. В будущем такую базу можно будет перенести на другой сервер без лишних проблем. А когда появится режим FULL, в теории проблем с переносом и вовсе не должно быть.
Ссылки по теме: