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

Обо мне

MVP

Data Architect at Intapp, Inc.

PASS Regional Mentor, CEE

MCT, MCITP, MCPD, MCTS


Microsoft MVP

Month List