“Contained database” w SQL Server 11(‘Denali) – czyli bazy danych niezależne od konfiguracji serwera

Udostępnij na: Facebook

Autor: Bartłomiej Graczyk

Opublikowano: 2011-07-07

Spistreści

  1. Wprowadzenie.
  2. Jak zacząć, czyli porównanie zawartych baz danych i standardowych.
  3. Faza 1 – Konfiguracja instancji
  4. Faza 2 – Tworzenie bazy danych.
  5. Faza 3 – Tworzenie użytkownika dla bazy typu contained.
  6. Faza 4 – Połączenie  do bazy typu contained.
  7. Podsumowanie.

 

Wprowadzenie

Celem artykułu jest przedstawienie koncepcji funkcjonowania nowego modelu utrzymywania baz danych,czyli bazy niezależnej od konfiguracji serwera, na którym się ona znajduje. Czy decyzja o migracji obecnej bazy danych do takiej postaci niesie ze sobą ograniczenia lub związana jest z jakimkolwiek ryzykiem? Między innymi na to pytanie każdy administrator – znając sposób funkcjonowania nowego typu baz danych – będzie w stanie odpowiedzieć.

Jak zacząć, czyli porównanie zawartych baz danych i standardowych

Wśród wielu zadań administratora baz danych są również te najprostsze do wykonania, jednakże ze względu na częstotliwość ich powtarzania (np. w środowisku dewelopersko-testowym, podczas migracji systemów) potrafią zająć nawet ok. 80% czasu pracy i przysporzyć nieoczekiwanych problemów. Wśród wspomnianych zadań znajdują się operacje takie jak założenie loginu, nadanie uprawnień, przeniesienie bazy danych na inny serwer. Warto w tym miejscu wspomnieć o typowej sytuacji przenoszenia bazy i związaną z tym koniecznością odtwarzania powiązania loginów (z poziomu serwera) z użytkownikami (na poziomie bazy danych).

Opis, jak wykonać taką operację poprawnie, można odszukać m.in. na stronach Technet.

Wspomniana operacja–niedość, że bardzo czasochłonna–obarczona jest dodatkowo dużym prawdopodobieństwem popełnienia błędu (w przypadku wykonywania operacji manualnie).

Czy w takim razie można tego uniknąć? Rozwiązaniem może być dostępny w SQL Server 11 ‘Denali’ nowy typ/rodzaj baz danych – bazy zawarte (eng. Contained databases). Więcej o koncepcji wykorzystania baz tego typu: https://msdn.microsoft.com/en-us/library/ff929071(SQL.110).aspx

Warto jednak podać tutaj bardzo uproszczoną definicję bazy typucontained, która zgodnie ze wskazanym źródłem jest bazą, która jest niezależna od konfiguracji serwera, na którym jest utrzymywana. Użytkownicy wykorzystywani na poziomie takiej bazy nie są w żaden sposób związani z instancją serwera (do tej pory istniało trwałe powiązanie login->user), co więcej– wszystkie informacje niezbędne do autentykacji użytkowników zawarte są bezpośrednio w bazie.

Faza 1 – Konfiguracja instancji

W celu utworzenia bazy typu contained konieczna jest zmiana konfiuguracji instancji serwera (domyślna konfiguracja po instalacji,że pozwala na tworzenie baz typu contained).

Po zalogowaniu do serwera SQL przez SQL Server Management Studio należy przejść do właściwości instancji serwera:

Rysunek 1. Dostęp do właściwości instancji serwera.

Zakładka zaawansowane “Advanced”:

Rysunek 2. Widok dostępu do ustawień zaawansowanych.

Zmiana opcji “Enabled contained databases” na wartość TRUE:

Rysunek 3. Widok zmiany ustawienia opcji serwera.

Wprowadzone zmiany należy zatwierdzić, wybierając OK. Zmiany zostaną uaktywnione po ponownym uruchomieniu instancji serwera SQL:

Rysunek 4. Zatwierdzenie wprowadzonych zmian.

Opcja alternatywna dla wykonania powyższej zmiany konfiguracji to:

-- Włączenie dostępu do zaawansowanych ustawień serwera:
sp_configure 'show advanced options',1 
RECONFIGURE 
GO 
-- Uaktywnienie mechanizm ucontained:
sp_configure 'contained database authentication',1 
RECONFIGURE 
GO 
-- Wyłączeni eopcj izaawansowanych:
sp_configure 'show advanced options',0 
RECONFIGURE 
GO

Faza 2 – Tworzenie bazy danych

We wcześniejszej części artykułu skonfigurowana została do działania instancja serwera SQL. Tu zaprezentowane zostanie utworzenie bazy typu contained:

W SSMS należy wybrać opcję New Database:

Rysunek 5. Graficzny interfejs tworzenia nowej bazy danych.

W polu „Nazwa” wprowadzić dowolną nazwę dla tworzonej bazy danych oraz ustawić parametr konfiguracji Containment type na wartość Partial:

Uwaga!
W chwili obecnej jedyną z dostępnych opcji dla baz typucontained jest stan Partial.
Opcja Partial oznacza, że baza jest w stanie umożliwiającym wykorzystywanie funkcjonalności contained. Warto jednak wspomnieć, że bazy typu contained partial mogą również wykorzystywać elementy niebędące ich częścią, a więc obiekty typu uncontainded. Kilka klasycznych przykładów elementów typu uncontained to np.:

  • endpointy,
  • użytkownicy powiązania z loginami,
  • obiekty odwołujące się do zewnętrznych baz danych w modelu nazw: database.schema.object

Ograniczenia dla baz typu contained:

  • brak możliwości wykorzystania replikacji,
  • brak możliwości uruchomienia mechanizmu change data capture i changetracking.

W wersji finalnej produktu dostępne będą dodatkowe opcje dla baz typu contained, m.in.Full contained (w tym trybie nie będzie możliwości wykorzystania obiektów niebędących częścią bazy).

Listę obiektów typu uncontainded zarówno dla baz typu contained,jak i zwykłych można sprawdzić, wykorzystując widok sys.dm_db_uncontained_entities

Rysunek 6. Wybór rodzaju trybu działania bazy.

Wprowadzone parametry należy zatwierdzić, wybierając OK:

Rysunek 7. Zatwierdzenie wprowadzonych zmian.

Powyższe kroki konfiguracyjne można wykonać z wykorzystaniem skryptu (T-SQL):

--Skrypttworzącybazętypu contained 
USE master; 
GO 
CREATEDATABASEContainedTestDB
CONTAINMENT=PARTIAL    --Uwaga! Nowaopcja: CONTAINMENT
ON
( NAME= ContainedTestDB_data, 
FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\ContainedTestDB_data.mdf', 
SIZE= 10, 
MAXSIZE = 50, 
FILEGROWTH = 5 ) 
LOG ON
( NAME= ContainedTestDB_log, 
FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\ContainedTestDB_log.ldf', 
SIZE= 5MB, 
MAXSIZE = 25MB, 
FILEGROWTH = 5MB ) ; 
GO

Faza 3 –Tworzenie użytkownika dla bazy typu contained

Utworzenie nowego użytkownika dla bazy typu contained można zrealizować z poziomu SSMS, wybierając z działu Security -> New User:

Rysunek 8. Tworzenie nowego użytkownika dla bazy typu contained.

Dla baz danych typu contained – partial dostępne są również opcje związane z wykorzystaniem użytkowników powiązanych z loginami serwera SQL (tradycyjny model login-> user). Jednakże dla baz danych typu contained – ze względu na ograniczenie możliwości stosowania obiektów niebedących obiektami typu contained.

Dla baz typu contained można tworzyć zarówno użytkowników typu SQL, jak również użytkowników w oparciu o konta Windows (korzystających z modelu autentykacji Windows). Dla obu typów użytkowników informacje zapisywane są wyłącznie na poziomie bazy danych (brak loginów na poziomie instancji serwera i wpisów w tabeli sys.server_principals).

Rysunek 9. Wprowadzenie danych użytkownika i akceptacji ustawień.

Lub:

   USE [ContainedTestDB]
GO
CREATE USER [ContainedUser] WITH PASSWORD=N'Pa$$w0rd'
GO

Po utworzeniu użytkownika można zweryfikować jego istnienie jedynie w bazie ContainedTestDB:

Logowanie na użytkownika typu contained możliwe jest tylko poprzez wskazanie domyślnej bazy daych w momencie nawiązywania połączenia z serwerem (umieszczenie nazwy bazy w Connection String). Brak wskazania nazwy bazy danych kończy próbę połączenia komunikatem błędu.

Rysunek 10. Widok obszaru Security instancji serwera i bazy danych.

Lub:

   select name from
sys.server_principals
WHERE type not in ('C','R')
USE ContainedTestDB
GO
select name,islogin from
sys.sysusers
where issqlrole=0



Rysunek 11. Widok zawartości tabeli użytkowników.

Dla porównania można skorzystać z poniższego skryptu dla utworzenia użytkownika, który posiada login na poziomie serwera, a więc jest użytkownikiem typu uncontained oraz został dla niego utworzony użytkownik w bazie ContainedTestDB:

   USE [master]
GO
CREATE LOGIN [NotContainedUser] WITH PASSWORD=N'Pa$$w0rd',
DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO
USE [ContainedTestDB]
GO
CREATE USER [NotContainedUser] FOR LOGIN [NotContainedUser]
GO


Rysunek 12. Widok zawartości tabeli użytkowiników bazy zawierającej standardowych użytkowników(not contained).

Faza 4 – Połączenie  do bazy typu contained

Połączenie do bazy typu contained realizowane jest w taki sam sposób, jak do  bazy wykorzystującej standardowy model login->user. Wyjątek stanowi konieczność podania nazwy bazy już na etapie konfiguracji parametrów połączenia:

Rysunek 13. Okno połączenia do serwera SQL.

 

Rysunek 14. Okno połączenia do serwera SQL cd.

 

Rysunek 15. Widok zawartości serwera po połączeniu.

W przypadku braku informacji o nazwie bazy próba połączenia kończy się błędem:

Rysunek 16. Okno połączenia do serwera SQL.

 

Rysunek 17. Błąd połączenia do instancji serwera.

Podsumowanie

Bazy typu contained stanowią bardzo ciekawe rozwiązanie dla środowisk, w których:

  • często wykonywane jest przenoszenie baz pomiędzy serwerami,
  • wszystkie elementy wykorzystywane w ramach aplikacji, implementowane po stronie bazy danych powinny być zupełnie niezależne od instancji serwera (np. collation, użytkownicy),
  • istnieje potrzeba uproszczenia czynności administracyjnych związanych z obszarem bazy danych – w przypadku baz typu contained do odtworzenia środowiska po awarii potrzebny jest jedynie backup bazy i działająca (skonfigurowana, nawet domyślnie) instancja serwera SQL.

W chwili obecnej działa jedynie tryb Partial dla baz typu contained, jednakże do momentu wydania wersji finalnej powinny zostać udostępnione również inne tryby – w tym Full contained uniemożliwiający implementacje jakichkolwiek elementów niebędących częścią bazy danych, a stanowiących element konfiguracji instancji serwera.