Databáze Microsoft SQL Server kromě běžného víceuživatelského připojení umožňuje i speciální možnosti připojení pro jednouživatelský přístup (single-user mode), jsou to SQL Server Express User Instances a SQL Server Express LocalDB. Poslední dobou jsem si všiml, že mnoho lidí (nejen zde na dotnetportal.cz) si tyto způsoby připojení pletou, tak jsem se rozhodl o nich napsat malé srovnání.
Běžné scénáře, kdy se dají jednouživatelské databáze využít, jsou v podstatě dva. První z nich je využití během vývoje aplikace ve vývojářském prostředí, druhý je využití ve Webových aplikacích.
SQL Server Express User Instances
Pokud máte nainstalován na počítači lokální instanci Microsoft SQL Serveru Express edici, tak ta již od verze SQL Express 2005 podporuje funkci User Instances. Jedná se o možnost připojení k databázi přímo s určením souborů databáze, kde se vytvoří samostatná SQL Server instance pro aktuálního uživatele. Účelem je umožnit připojení k SQL Server instanci s plnými právy i pro uživatelé co mají na svém lokálním počítači omezená administrátorská práva (nejsou local administrators). Funguje to pouze když rodičovská instance je lokální instance Express edice SQL Serveru a pouze pokud je použito připojení s Windows autentizací (Integrated Security) tj- SQL Server loginy nejsou podporované. User Instance je také přístupná pouze přes Shared Memory a nebo přes lokální named pipes. Z tohoto důvodu je docela složité připojení k User Instanci například přes Management Studio, ale lze to viz tento článek.
Nejčastěji se User Instances využívá pro vývoj ve spojení s Visual Studiem, nebo ve ASP.NET webových aplikací, kde jsou soubory databáze (mdf, ldf) umístěny v podadresáři App_Data. V connection stringu, který v takové aplikaci máme pak nastavujeme databázový soubor pomoci AttachDbFilename, a také musíme uvést nastavení User Instance=True. Příklad celého connection stringu vypadá takto:
Data Source=.\sqlexpress;AttachDbFilename=|DataDirectory|\MyDatabaseFileName.mdf;Integrated Security=True;User Instance=True
Ještě je ale potřeba zmínit, že tato funkce je od SQL Server verze 2012 již označena za deprecated, ale zatím stále funguje i na SQL 2014. Nahrazuje jí totiž novější SQL Server Express LocalDB.
SQL Server Express LocalDB
Novější SQL Server Express LocalDB (někdy označována pouze LocalDB) byla uvedena s SQL Server 2012 a nahrazuje User Instances. Na rozdíl od User Instances se jedná o samostatnou komponentu SQL Serveru, nikoliv pouze funkci Express edice.
Podobně jako u User Instances se jedná o samostatnou instanci SQL Server pro uživatele, která se vytvoří až při připojení k ní, a opět k jejímu vytvoření nejsou potřeba na počítači administrátorská práva. Databázové soubory například nově vytvořené databáze se vytvářejí v umístění v uživatelském profilu.
Výhodou oproti User Instances je to, že LocalDB je možné nainstalovat jednoduše pomoci samostatného balíčku (velikost balíčku je přibližně 40MB) a není závislá na SQL Server Express, který na počítači nemusí být nainstalován. (Tento balíček je ale nabízen i jako součást při instalaci SQL Server Express.)
Samostatnou instalaci provedeme přímo balíčkem SqlLocalDB.msi, který je ke stažení u SQL Server Express.
LocalDB ale na rozdíl od User Instances není plnohodnotná instalace SQL Serveru, protože některé funkce jako například FILESTREAM nejsou podporované.
K LocalDB instanci se opět připojujeme pouze pomoci Windows Integrated Security. Při připojení můžeme také rovnou určit soubor databáze (mdf), který se připojí (pomoci AttachDbFilename). Na rozdíl od user instances se můžeme k LocalDB instanci připojit jednoduše i přímo z Management studia. Jako jméno serveru musíme ovšem uvést buď:
(localdb)\v11.0 pro SQL Server Express LocalDB 2012, nebo
(localdb)\MSSQLLocalDB pro SQL Server Express LocalDB 2014.
Tato instance LocalDB se jmenuje Automatic instance. Pokud jí používáme v aplikaci, tak náš connection string bude vypadat pro LocalDB 2012 takto:
Data Source=(localDb)\v11.0;AttachDbFilename=|DataDirectory|\MyDatabaseFileName.mdf;Integrated Security=True
nebo takto pro LocalDB 2014:
Data Source=(localDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\MyDatabaseFileName.mdf;Integrated Security=True
Kromě Automatic instances navíc LocalDB podporuje pojmenované instance - Named instances. Zatím co Automatic instance jsou veřejné, pojmenované instance jsou soukromé. Pojmenované instance musí být vytvořené explicitně pomoci LocalDB management API nebo konfigurací v aplikaci. Vytvoření instance lze provést pomoci commnad-line utility SqlLocalDB, více zde.
Jak Automatic tak Named instance mohou být dále v LocalDB sdílené – shared. Sdílené instance jsou viditelné všem uživatelům na počítači, k vytvoření shared instance jsou ovšem již potřebná administrátorská práva. Připojení ke sdílené instanci se prování pomoci uvedení .\ a jména shared instance (jméno shared instance je jedinečné na počítač), například tedy (localdb)\.\AppData (kde AppData je jméno shared instance).
Jinak Microsoft tvrdí, že LocalDB je určena především pro vývojáře, ale pokud LocalDB vyhovuje cílovým potřebám navrhované aplikace, tak jej lze přenést i do produkce.
Pokud používáte SQL Server Compact, tak se vám muže zdát s LocalDB velice podobné. Obě jsou určeny pro jednodušší databáze, s jednoduchou instalací a jednouživatelském připojení přímo na databázový soubor. LocalDB mělo totiž splnit tyto vlastnosti jednoduchého použití, navíc byl však cílem i velký výkon a kompatibilita s plným SQL Serverem.
Hlavní rozdíly LocalDB a SQL Server Compact jsou:
- SQL Server Compact je spouštěn in-process s aplikací, LocalDB je spouštěna jako samostatný proces.
- SQL Server Compact používá soubory databáze s příponou .sdf, LocalDB standardní .mdf a .ldf datové a transakční soubory.
- SQL Server Compact zabírá okolo 4MB, kdyžto instalace LocalDB okolo 140MB
- SQL Server Compact nabízí pouze základní funkce SQL, zatímco LocalDB poskytuje mnohem bohatší sadu funkcí, včetně uložených procedur, Geometry and Geography datových typů a další.