SQL Server Denali: Contained Databases

        Возобновляя серию статей, посвящённую новым возможностям 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.

image

Создать Contained базу данных и Contained пользователя можно при помощи следующего скрипта:

CREATE DATABASE MyDatabase CONTAINMENT = PARTIAL
GO

CREATE USER MyUser WITH PASSWORD = 'test'
GO

 

Здесь ключевое слово CONTAINMENT говорит о том, что база данных будет Contained. У этого параметра 3 значения:

  • NONE (обычная база)
  • PARTIAL (декларирует возможность создания Contained объектов)
  • FULL (полная независимость базы (в CTP1 не поддерживается))

После создания базы и пользователя, можно пробовать залогиниться. При соединении из SSMS, нужно обязательно выбрать базу данных с которой вы соединяетесь:

image

В противном случае соединение будет устанавливаться по дефолту с базой данных master и вы получите ошибку соединения:

image

После успешного соединения в Object Explorer вы увидите примерно следующую картину:

image

Это как раз то, что нужно. Мы видим только базу данных, с которой можем работать, и не видим никаких объектов сервера. В будущем такую базу можно будет перенести на другой сервер без лишних проблем. А когда появится режим FULL, в теории проблем с переносом и вовсе не должно быть.

Ссылки по теме:

blog comments powered by Disqus

Uneta Plus


TechEd Russi 2011

Обо мне

MVP

Head of Web Development department at DCT

Trainer at Microsoft Innovation Center

MCT, MCITP, MCPD, MCTS


Microsoft MVP

Month List