Lo scopo principale dei database contenuti è quello di semplificare il porting del database su un nuovo server senza molte impalcature al suo interno. Con questo in mente, tratterò alcuni potenziali problemi che renderanno più difficile questa migrazione - e la maggior parte ruota attorno al fatto che i database contenuti sono contenuti solo parzialmente in SQL Server 2012 (il contenimento non è effettivamente applicato).
Stringhe di connessione
Le stringhe di connessione a un database contenuto devono specificare esplicitamente il database nella stringa di connessione. Non è più possibile fare affidamento sul database predefinito di accesso per stabilire una connessione; se non si specifica un database, SQL Server non eseguirà il controllo di tutti i database contenuti e tenterà di trovare qualsiasi database in cui le credenziali possano corrispondere.
Query cross-db
Anche se si crea lo stesso utente con la stessa password in due diversi database contenuti sullo stesso server, l'applicazione non sarà in grado di eseguire query tra database. I nomi utente e password possono essere gli stessi, ma sono non lo stesso utente. La ragione di questo? Se hai contenuto database su un server ospitato, non dovresti impedire loro di avere lo stesso utente contenuto di qualcun altro che utilizza lo stesso server ospitato. Quando arriva il contenimento completo (probabilmente nella versione dopo SQL Server 2012 mai), le domande tra database saranno assolutamente vietate. Consiglio vivamente, caldamente, di non creare accessi a livello di server con lo stesso nome degli utenti di database contenuti e di provare a evitare di creare lo stesso nome utente contenuto su database contenuti. Se è necessario eseguire query che colpiscono più database contenuti, farlo utilizzando un accesso a livello di server con privilegi appropriati (si potrebbe pensare che lo sia sysadmin
, ma per query di sola lettura, questo è CONNECT ANY DATABASE
e SELECT ALL USER SECURABLES
).
Sinonimi
La maggior parte dei nomi di 3 e 4 parti sono facili da identificare e compaiono in un DMV. Tuttavia, se si crea un sinonimo che punta a un nome di 3 o 4 parti, questi non vengono visualizzati nel DMV. Pertanto, se si fa un uso intensivo dei sinonimi, è possibile che manchino alcune dipendenze esterne e ciò può causare problemi nel momento in cui si esegue la migrazione del database su un altro server. Mi sono lamentato di questo problema, ma è stato chiuso come "di progettazione" e non è sopravvissuto alla migrazione al nuovo sistema di feedback . Notare che al DMV mancheranno anche i nomi di 3 e 4 parti che sono costruiti tramite SQL dinamico.
Politica password
Se è stato creato un utente di database contenuto su un sistema senza un criterio password in atto, potrebbe essere difficile creare lo stesso utente su un sistema diverso in cui è presente un criterio password. Questo perché la CREATE USER
sintassi non supporta l'esclusione del criterio password. Ho segnalato un bug su questo problema, e rimane aperto (e non è sopravvissuto alla mossa quando Connect è stato ritirato). E mi sembra strano che su un sistema con una politica di password in atto, è possibile creare un accesso a livello di server che ignori facilmente la politica, ma non è possibile creare un utente di database che lo faccia, anche se questo utente è intrinsecamente meno rischi per la sicurezza.
confronto
Dal momento che non possiamo più fare affidamento sul confronto di tempdb, potrebbe essere necessario modificare qualsiasi codice che attualmente utilizza il confronto esplicito o DATABASE_DEFAULT
utilizzare CATALOG_DEFAULT
invece. Vedi questo articolo BOL per alcuni potenziali problemi .
IntelliSense
Se ci si connette a un database contenuto come utente contenuto, SSMS non supporterà completamente IntelliSense. Otterrai una sottolineatura di base per gli errori di sintassi, ma non elenchi o descrizioni comandi di completamento automatico e tutte le cose divertenti. Ho segnalato un bug su questo problema, e rimane aperto - e un altro che non è sopravvissuto alla mossa.
SQL Server Data Tools
Se si prevede di utilizzare SSDT per lo sviluppo di database, al momento non è disponibile il supporto completo per i database contenuti. Ciò significa che la costruzione del progetto non fallirà se si utilizzano alcune funzionalità o sintassi che interrompono il contenimento, dal momento che SSDT attualmente non sa cosa sia il contenimento e cosa potrebbe romperlo.
ALTER DATABASE
Quando si esegue un ALTER DATABASE
comando all'interno del contesto di un database contenuto, rR piuttosto ALTER DATABASE foo
che sarà necessario utilizzare ALTER DATABASE CURRENT
- questo è così che se il database viene spostato, rinominato, ecc., Questi comandi non devono sapere nulla sul loro contesto esterno o riferimento .
Pochi altri
Alcune cose che probabilmente non dovresti ancora usare ma che comunque dovrebbero essere menzionate nell'elenco delle cose che non sono supportate o sono deprecate e non dovrebbero essere usate in database contenuti:
- procedure numerate
- procedure temporanee
- le modifiche delle regole di confronto negli oggetti associati
- modifica acquisizione dati
- rilevamento delle modifiche
- replicazione
Detto questo, questi non sono necessariamente svantaggi dell'utilizzo di database contenuti, sono solo problemi di cui dovresti essere a conoscenza e che non sono tutti esplicitamente divulgati nella documentazione ufficiale.
Dovrai anche essere sicuro che se un database contenuto verrà migrato, o fa parte di un gruppo di disponibilità o viene sottoposto a mirroring, tutti i potenziali server di destinazione hanno l' sp_configure
opzione contained database authentication
impostata su 1.
Puoi trovare utile questo post sul blog , oltre a questo , anche se hanno una data precedente a RTM.