Основна мета баз даних, що містяться, - полегшити перенесення вашої бази даних на новий сервер без великої кількості скелетів навколо нього. Зважаючи на це, я розглядаю декілька потенційних проблем, які ускладнять цю міграцію - і більшість з них стосується того, що бази даних містяться лише частково в SQL Server 2012 (обмеження фактично не виконується).
З'єднання струн
Рядки підключення до вміщеної бази даних повинні чітко вказати базу даних у рядку з'єднання. Ви більше не можете покладатися на базу даних за замовчуванням для входу, щоб встановити з'єднання; якщо ви не вказали базу даних, SQL Server не збирається переглядати всі вміщені бази даних і намагається знайти будь-яку базу даних, де можуть відповідати ваші облікові дані.
Перехресні запити
Навіть якщо ви створили того самого користувача з тим самим паролем у двох різних вміщених базах даних на одному сервері, ваша програма не зможе виконувати запити міжбазових баз даних. Імена користувача та паролі можуть бути однаковими, але вони не є тим самим користувачем. Причина цього? Якщо ви розмістили бази даних на розміщеному сервері, вам не слід перешкоджати тому, що той самий вміщений користувач, як хтось інший, який, як правило, використовує той же розміщений сервер. Коли надходить повне обмеження (ймовірно, у версії після SQL Server 2012 ніколи), крос-бази запитів у будь-якому випадку абсолютно забороняться. Я дуже, дуже настійно рекомендую не створювати входи на рівні сервера з тим самим іменем, що і користувачі баз даних, і намагатися уникати створення однакових ім’я користувачів, що містяться в базі даних. Якщо вам потрібно запустити запити, які потрапляють на кілька містяться баз даних, зробіть це за допомогою входу на рівні сервера, який має відповідні привілеї (ви можете подумати, що це так sysadmin
, але для запитів лише для читання це є CONNECT ANY DATABASE
і SELECT ALL USER SECURABLES
).
Синоніми
Більшість 3- і 4-частинних імен легко ідентифікувати та відображатись у DMV. Однак якщо ви створюєте синонім, який вказує на 3- або 4-частинне ім'я, вони не відображаються в DMV. Отже, якщо ви сильно використовуєте синоніми, можливо, ви пропустите деякі зовнішні залежності, і це може спричинити проблеми в момент переміщення бази даних на інший сервер. Я поскаржився на це питання, але воно було закрите як "задумом" і не пережило міграцію до нової системи зворотного зв'язку . Зауважте, що DMV також буде пропускати 3- та 4-імена імена, побудовані за допомогою динамічного SQL.
Політика щодо паролів
Якщо ви створили вміщеного користувача бази даних у системі без встановленої політики паролів, можливо, вам буде важко створити того самого користувача в іншій системі, яка має політику паролів. Це відбувається тому, що CREATE USER
синтаксис не підтримує обхід політики паролів. Я подав помилку щодо цієї проблеми, і вона залишається відкритою (і вона також не пережила ходу, коли Connect вийшла на пенсію). І мені здається дивним, що в системі, що має політику паролів, ви можете створити логін на рівні сервера, який легко обходить політику, але ви не можете створити користувача бази даних, який це робить - навіть якщо цей користувач притаманний менше ризику для безпеки.
Збірка
Оскільки ми більше не можемо покладатися на зіставлення tempdb, можливо, вам доведеться змінити будь-який код, який наразі використовує явне зіставлення, або DATABASE_DEFAULT
використовувати CATALOG_DEFAULT
замість цього. Дивіться цю статтю BOL щодо деяких потенційних проблем .
IntelliSense
Якщо ви підключитесь до бази даних, що міститься як користувач, що зберігається, SSMS не буде повністю підтримувати IntelliSense. Ви отримаєте основні підкреслення синтаксичних помилок, але немає автоматичного заповнення списків чи підказок та всіх цікавих матеріалів. Я подав помилку щодо цього питання, і він залишається відкритим - і ще один, який не пережив цього кроку.
Інструменти даних SQL Server
Якщо ви плануєте використовувати SSDT для розробки баз даних, наразі не існує повної підтримки вміщених баз даних. Що насправді просто означає, що створення проекту не вийде з ладу, якщо ви використовуєте якусь функцію або синтаксис, який порушує вміст, оскільки SSDT в даний час не знає, що таке вміст і що може порушити його.
АЛЬТЕР ДАТАБАЗА
При запуску ALTER DATABASE
команди з в контексті вмісту бази даних, rRather , ніж ALTER DATABASE foo
вам потрібно буде використовувати ALTER DATABASE CURRENT
- це так , що , якщо база даних переміщені, перейменовані і т.д. ці команди не повинні нічого знати про свій зовнішній контексті або посилання .
Кілька інших
Деякі речі, які ви, мабуть, досі не повинні використовувати, але, тим не менш, слід згадати у списку речей, які не підтримуються або застаріли і не повинні використовуватися у вміщених базах даних:
- пронумеровані процедури
- тимчасові процедури
- зміни зіставлення в пов'язаних об'єктах
- змінити захоплення даних
- відстеження змін
- тиражування
Зважаючи на все, це не обов'язково недоліки використання баз даних, що містяться, це лише проблеми, про які слід пам’ятати, і не всі вони чітко розкриваються в офіційній документації.
Вам також потрібно бути впевненим, що якщо міститься база даних, яка буде переміщена, або є частиною групи доступності або відображається в дзеркальному відображенні, що для всіх потенційних серверів призначення встановлено sp_configure
параметр contained database authentication
1.
Ви можете вважати цю публікацію в блозі корисною, як і цю , навіть незважаючи на те, що вони датують RTM.