|
|
|||||||||||||||||||||||||||||
|
SQL Server 2011 - Автономная база данныхИсточник: habrahabrru Niladri Biswas
Denali несет в себе множество новых инструментов, а так же расширений функционала для существующих. В этой статье в деталях рассмотрим один из новых инструментов, который, я уверен, придется по душе разработчикам баз данных. Этот инструмент, фича - автономные базы данных (Contained Database). Рассмотрим что они собой представляют, как с ними работать, к чему можно применить и другие вещи. Что не так с текущими базами? Перед тем как перейти к описанию сущности независимых баз данных, рассмотрим почему они были придуманы и чем не устраивает разработчиков текущая реализация. Вот некоторые из ключевых проблем: После того, как обозначили ключевые недостатки существующих баз, перейдем к описанию нового типа. Автономные базы данных Уже исходя из названия и описанных недостатков старых баз, я думаю, вы догадываетесь, в чем прелесть нового типа баз. Автономные базы данных хранят всю необходимую для работы и настройки информацию в себе. Такие базы полностью независимы от настроек SQL сервера, не имеют внешних зависимостей и содержат в себе все механизмы аутентификации. Так же не имеет значения, какая настройка языка выставлена у сервера. Таблицы, функции, процедуры, ограничения, схемы, типы, библиотеки, представления, логины, задания агента SQL Server, системные настройки, связанные сервера (linked servers) - все хранится в базе. Естественно, что главным преимуществом такой базы будет легкость разворачивания и переноса. Достаточно только развернуть базу и она сразу готова к работе. Больше не будет забытых скриптов для пользователей, их ролей, агентов и тд. Термины, которые надо запомнить Application boundary (граница приложения) - граница между экземпляром сервера и кодом приложения. Под кодом приложения понимается вся база со всеми объектами, которые могут понадобиться в процессе работы. Application Model (модель приложения) - внутри границ приложения есть место, где идет разработка и управление приложением. Contained (содержащийся) - пользовательская сущность которая полностью содержится в пределах границы приложения. Uncontained (не содержащийся) - пользовательская сущность которая пересекает границы приложения. Non-contained database (зависимая база данных) -база, для которой свойство containment = NONE. База зависит от некоторых объектов принадлежащих экземпляру сервера. Fully contained database (автономная база данных) - база, которая не позволяет каким-либо объектам или функциям пересекать границы приложения. Partially contained database (частично зависимая база данных) - база, которая позволяет некоторым объектам действовать с пересечением границ приложения. Доступно в CTP 1. Contained user (автономный пользователь) Есть два типа таких пользователей:
4 шага для создания автономной базы данных Я думаю, что на данный момент уже достаточно теоретических знаний и концепций о том, как работает такая база данных, и настало время немного размяться "в поле". Следующие 4 шага описывают как создать автономную базу данных. Шаг 1. Разрешить использование автономных баз данных на уровне сервера. Шаг 2. Создать базу данных и выставить режим автономности как частичный. Свойство CONTAINMENT должно быть равно Partial. Шаг 3. Создать автономного пользователя в новой базе данных. Шаг 4. Зайти в новую базу данных под учетной записью автономного пользователя.
Теперь рассмотрим каждый шаг подробно и в картинках. Шаг 1. Разрешить использование автономных баз данных на уровне сервера. Присоединитесь к экземпляру нового SQL Server 2011 и из Обозревателя объектов (Object Explorer) вызовите контекстное меню для сервера. В контекстном меню необходимо выбрать пункт Properties (Свойства). Перейдите на страницу Advanced и на ней необходимо выставить значение для свойства Enable Contained Databases равное TRUE.
То же самое может быть достигнуто с помощью скрипта. --Enabled Database Containment Создадим новую базу и назовем ее TestContainedDB. После создания открываем ее свойства через контекстное меню Открываем закладку Options и выбираем для опции Containment type: свойство Partial.
То же самое может быть достигнуто с помощью скрипта. CREATE DATABASE [TestContainedDB] ALTER DATABASE [TestContainedDB] SET COMPATIBILITY_LEVEL = 110 Шаг 3. Создать автономного пользователя в новой базе данных. В новой базе данных перейдите в узел Security, затем Users и с помощью контекстного меню создаем нового пользователя. Задаем имя учетной записи и пароль. Пусть для примера это будет testuser\testuser.
Указываем, что пользователь будет владельцем базы. Для этого на странице Membership отмечаем галочкой пункт db_owner. Эти же действия можно совершить при помощи TSql Как только описанные действия будут завершены, можно убедиться, что пользователь появился в системе.
Шаг 4. Зайти в новую базу данных под учетной записью автономного пользователя. Для демонстрации шага надо завершить работу в SSMS, и войти снова следуя описанным шагам. В полях для имени пользователя и пароля введите ту информацию, которую задавали во время создания пользователя для автономной базы. В нашем случае это testuser \ testuser.
После этого надо нажать на кнопку Options и перейти на закладку Connection Properties.
На этой закладке надо указать к какой базе данных мы собираемся присоедениться. В данном случае это TestContainedDB. Теперь можно жать на кнопку Connect, и мы окажемся в автономном окружении базы. Конвертация базы в автономную Я думаю после описания плюсов автономной базы данных и того, как ее можно создать, вы задумались о том, можно ли перевести существующую базу в автономный режим. Можно. Сейчас будет продемонстрирован такой процесс. Поскольку демонстрация будет вестись на тестовой базе, то для начала ее и создам, воспользовавшись скриптом ниже: CREATE DATABASE [NonContainedDB] ALTER DATABASE [NonContainedDB] SET COMPATIBILITY_LEVEL = 110 IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled')) Затем создаем таблицу с данными. --Insert the records INSERT INTO tbl_Players(PlayerName, BelongsTo, MatchPlayed,RunsMade,WicketsTaken,FeePerMatch) VALUES('M. Karol','US',15,44,4, 2000000) INSERT INTO tbl_Players(PlayerName, BelongsTo, MatchPlayed,RunsMade,WicketsTaken,FeePerMatch) VALUES('A.Namaki','Australia',1,4,180, 999999) INSERT INTO tbl_Players(PlayerName, BelongsTo, MatchPlayed,RunsMade,WicketsTaken,FeePerMatch) VALUES('S. Noami','Singapore',165,484,45, 5678) Для полноты картины добавим хранимую процедуру. В итоге у нас должна быть база данных, таблица и хранимая процедура. Сейчас база работает в нормальном, зависимом режиме и нашей целью будет превратить ее в автономную базу данных. Шаг 1 На первом шаге нужно будет создать нового пользователя на уровне сервера и пользователя для базы. Это можно сделать с помощью такого скрипта: --Create a "non-contained" users for the login on the server Теперь надо определить какие объекты принадлежат связанной базе данных. Для этого можно выполнить следующий код SELECT Результат должен быть как на скриншоте ниже. Можно проигнорировать ROUTE. Итак, по данным скрипта, у нас имеется 2 объекта в связанной базе данных. Для определения пользователей принадлежащих серверу можно запустить такой скрипт: Что даст нам в результате выполнения Шаг 3 На базе NonContainedDB надо вызвать контекстное меню и выбрать Properties. Затем перейти на закладку Options и выбрать для свойства Containment type значение Partial. Другой способ для описанных действий заключается в написании скрипта После того как настройка выставлена, необходимо мигрировать пользователей на автономную базу. Процедура sp_migrate_user_to_contained нужна для миграции пользователей в автономную базу. Она конвертирует пользователей уровня сервера в пользователей автономной базы. После процедуры можно снова запустить скрипт определяющий зависимых пользователей. И результат: Можно убедиться что NonContainedUser больше не появляется. Это означает что пользователь был изменен и его учетная запись была заблокирована на уровне сервера. Шаг 4. Отсоединитесь от текущего сервера и вызовите форму соединения. В полях для имени и пароля введите данные пользователя, которого мы мигрировали на автономную базу. Далее в опциях соединения задайте все как упоминалось выше, в разделе соединения с автономной базой. После соединения в строке о базе данных должно быть что-то похожее. Бэкап автономной базы данных. Осуществляется точно так же как и архивирование обычной базы данных. Так что это процесс можно сделать с интерфейса пользователя или с помощью скрипта. Присоединитесь к базе данных с помощью SSMS, в навигаторе объектов (Object Explore) находите желаемую базу. В контекстном меню идете по пунктам Tasks > Backup Скрипт Сделать бэкап базы можно с помощью нехитрого скрипта. Восстановление архивной базы Опять же есть два пути: через интерфейс пользователя и с помощью скрипта. Через интерфейс все делается схожим образом с архивированием Присоединитесь к базе данных с помощью SSMS, в навигаторе объектов (Object Explore) находите желаемую базу. В контекстном меню идете по пунктам Tasks > Restore RESTORE DATABASE TestContainedDB Во время восстановления базы можно получить сообщение: Msg 12824, Level 16, State 1, Line 1 The sp_configure value 'contained database authentication' must be set to 1 in order to restore a contained database. You may need to use RECONFIGURE to set the value_in_use. Msg 3013, Level 16, State 1, Line 1 RESTORE DATABASE is terminating abnormally. Из которого становится ясно, что необходимо активировать опцию Contained Database Authentication в настройках SQL Server на уровне экземпляра сервера. Эта настройка по умолчанию выключена. Выполните скрипт ниже для устранения проблемы. Методы аутентификации поддерживаемые автономными базами остались те же: Изменение базы данных изменилось. CREATE / ALTER DATABASE работают теперь по-другому. Выражение Alter Database <database name> больше не работает. Вместо имени базы надо указывать служебное слово CURRENT.
|
|