SQL Server Express-användarinstanser
SQL Server Express Edition stöder funktionen för användarinstanser, som endast är tillgänglig när du använder .NET Framework Data Provider för SQL Server (SqlClient
). En användarinstans är en separat instans av SQL Server Express Database Engine som genereras av en överordnad instans. Med användarinstanser kan användare som inte är administratörer på sina lokala datorer ansluta och ansluta till SQL Server Express-databaser. Varje instans körs under säkerhetskontexten för den enskilda användaren, på basis av en instans per användare.
Funktioner för användarinstanser
Användarinstanser är användbara för användare som kör Windows under ett lua-konto (least-privilege user account). Varje användare har behörighet som SQL Server-systemadministratör (sysadmin
) över den instans som körs på datorn utan att behöva köras som Windows-administratör. Programvara som körs på en användarinstans med begränsad behörighet kan inte göra ändringar i hela systemet eftersom instansen av SQL Server Express körs under användarens Windows-konto som inte är administratör, inte som en tjänst. Varje användarinstans är isolerad från den överordnade instansen och från andra användarinstanser som körs på samma dator. Databaser som körs på en användarinstans öppnas endast i enanvändarläge och det är inte möjligt för flera användare att ansluta till databaser som körs på en användarinstans. Replikering och distribuerade frågor är också inaktiverade för användarinstanser.
Kommentar
Användarinstanser behövs inte för användare som redan är administratörer på sina egna datorer eller för scenarier som involverar flera databasanvändare.
Aktivera användarinstanser
För att generera användarinstanser måste en överordnad instans av SQL Server Express köras. Användarinstanser aktiveras som standard när SQL Server Express installeras och de kan uttryckligen aktiveras eller inaktiveras av en systemadministratör som kör den sp_configure systemlagringsproceduren på den överordnade instansen.
-- Enable user instances.
sp_configure 'user instances enabled','1'
-- Disable user instances.
sp_configure 'user instances enabled','0'
Nätverksprotokollet för användarinstanser måste vara lokala namngivna pipes. Det går inte att starta en användarinstans på en fjärrinstans av SQL Server och SQL Server-inloggningar tillåts inte.
Ansluta till en användarinstans
Nyckelorden User Instance
och AttachDBFilename
ConnectionString tillåter att en SqlConnection ansluter till en användarinstans. Användarinstanser stöds också av SqlConnectionStringBuilder UserInstance
egenskaperna och AttachDBFilename
.
Överväg följande anslutningssträng.
Data Source=.\\SQLExpress;Integrated Security=true;
User Instance=true;AttachDBFilename=|DataDirectory|\InstanceDB.mdf;
Initial Catalog=InstanceDB;
I den här anslutningssträng:
- Nyckelordet
Data Source
refererar till den överordnade instansen av SQL Server Express som genererar användarinstansen. Standardinstansen är .\sqlexpress. Integrated Security
är inställt påtrue
. För att ansluta till en användarinstans krävs Windows-autentisering. SQL Server-inloggningar stöds inte.User Instance
är inställt påtrue
, som anropar en användarinstans. (Standardvärdet ärfalse
.)- Nyckelordet
AttachDbFileName
anslutningssträng används för att bifoga den primära databasfilen (.mdf), som måste innehålla det fullständiga sökvägsnamnet.AttachDbFileName
motsvarar också nycklarna "utökade egenskaper" och "initialt filnamn" i en SqlConnection anslutningssträng. - Ersättningssträngen
|DataDirectory|
som omges av pipe-symbolerna refererar till datakatalogen för programmet som öppnar anslutningen och tillhandahåller en relativ sökväg som anger platsen för .mdf- och .ldf-databasen och loggfilerna. Om du vill hitta filerna någon annanstans måste du ange den fullständiga sökvägen till filerna.
Kommentar
Du kan också använda SqlConnectionStringBuilder.UserInstance egenskaperna och SqlConnectionStringBuilder.AttachDBFilename för att skapa en anslutningssträng vid körning.
Viktigt!
Microsoft rekommenderar att du använder det säkraste tillgängliga autentiseringsflödet. Om du ansluter till Azure SQL är hanterade identiteter för Azure-resurser den rekommenderade autentiseringsmetoden.
Använda |DataDirectory| Ersättningssträng
AttachDbFileName
utökades i ADO.NET 2.0 med införandet av ersättningssträngen |DataDirectory|
(omgiven i rörsymboler). DataDirectory
används tillsammans med AttachDbFileName
för att ange en relativ sökväg till en datafil, vilket gör det möjligt för utvecklare att skapa anslutningssträng som baseras på en relativ sökväg till datakällan i stället för att behöva ange en fullständig sökväg.
Den fysiska plats som DataDirectory
pekar på beror på typen av program. I det här exemplet finns den Northwind.mdf fil som ska bifogas i programmets \app_data-mapp.
Data Source=.\\SQLExpress;Integrated Security=true;
User Instance=true;
AttachDBFilename=|DataDirectory|\app_data\Northwind.mdf;
Initial Catalog=Northwind;
När DataDirectory
används kan den resulterande filsökvägen inte vara högre i katalogstrukturen än den katalog som substitutionssträngen pekar på. Om det fullständigt expanderade DataDirectory
till exempel är C:\AppDirectory\app_data fungerar exemplet anslutningssträng som visas ovan eftersom det är under c:\AppDirectory. Om du försöker ange DataDirectory
detta |DataDirectory|\..\data
resulterar det dock i ett fel eftersom \data inte är en underkatalog till \AppDirectory.
Om anslutningssträng har en felaktigt formaterad ersättningssträng genereras enArgumentException.
Kommentar
System.Data.SqlClient löser ersättningssträngarna till fullständiga sökvägar mot det lokala datorfilsystemet. Därför stöds inte namn på fjärrserver, HTTP och UNC-sökväg. Ett undantag utlöses när anslutningen öppnas om servern inte finns på den lokala datorn.
När öppnas SqlConnection omdirigeras den från SQL Server Express-standardinstansen till en körningsinitierad instans som körs under anroparens konto.
Kommentar
Det kan vara nödvändigt att öka ConnectionTimeout värdet eftersom användarinstanser kan ta längre tid att läsa in än vanliga instanser.
Följande kodfragment öppnar ett nytt SqlConnection
, visar anslutningssträng i konsolfönstret och stänger sedan anslutningen när kodblocket avslutasusing
.
Private Sub OpenSqlConnection()
' Retrieve the connection string.
Dim connectionString As String = GetConnectionString()
Using connection As New SqlConnection(connectionString)
connection.Open()
Console.WriteLine("ConnectionString: {0}", _
connection.ConnectionString)
End Using
End Sub
private static void OpenSqlConnection()
{
// Retrieve the connection string.
string connectionString = GetConnectionString();
using (SqlConnection connection =
new SqlConnection(connectionString))
{
connection.Open();
Console.WriteLine("ConnectionString: {0}",
connection.ConnectionString);
}
}
Kommentar
Användarinstanser stöds inte i CLR-kod (Common Language Runtime) som körs i SQL Server. En InvalidOperationException utlöses om Open
anropas på en SqlConnection som har User Instance=true
i anslutningssträng.
Livslängd för en användarinstansanslutning
Till skillnad från versioner av SQL Server som körs som en tjänst behöver SQL Server Express-instanser inte startas och stoppas manuellt. Varje gång en användare loggar in och ansluter till en användarinstans startas användarinstansen om den inte redan körs. Användarinstansdatabaser har AutoClose
alternativet inställt så att databasen stängs av automatiskt efter en period av inaktivitet. Den sqlservr.exe processen som startas körs under en begränsad tidsgräns efter att den senaste anslutningen till instansen har stängts, så den behöver inte startas om om en annan anslutning öppnas innan tidsgränsen har upphört att gälla. Användarinstansen stängs automatiskt av om ingen ny anslutning öppnas innan tidsgränsen har löpt ut. En systemadministratör på den överordnade instansen kan ange varaktigheten för tidsgränsen för en användarinstans genom att använda sp_configure för att ändra tidsgränsalternativet för användarinstansen. Standardvärdet är 60 minuter.
Kommentar
Om Min Pool Size
används i anslutningssträng med ett värde som är större än noll, behåller anslutningspoolen alltid några öppna anslutningar och användarinstansen stängs inte av automatiskt.
Så här fungerar användarinstanser
Första gången en användarinstans genereras för varje användare kopieras huvud - och msdb-systemdatabaserna från mappen Malldata till en sökväg under användarens lokala programdatalagringsplatskatalog för exklusiv användning av användarinstansen. Den här sökvägen är vanligtvis C:\Documents and Settings\<UserName>\Local Settings\Application Data\Microsoft\Microsoft SQL Server Data\SQLEXPRESS
. När en användarinstans startas skrivs även tempdb-, logg- och spårningsfilerna till den här katalogen. Ett namn genereras för instansen, som garanterat är unikt för varje användare.
Som standard beviljas alla medlemmar i gruppen Windows Builtin\Users behörighet att ansluta på den lokala instansen samt läsa och köra behörigheter på SQL Server-binärfilerna. När autentiseringsuppgifterna för den anropande användaren som är värd för användarinstansen har verifierats blir den användaren på den instansen sysadmin
. Endast delat minne är aktiverat för användarinstanser, vilket innebär att endast åtgärder på den lokala datorn är möjliga.
Användare måste beviljas både läs- och skrivbehörigheter för de .mdf- och .ldf-filer som anges i anslutningssträng.
Kommentar
Filerna .mdf och .ldf representerar databasen respektive loggfilerna. Dessa två filer är en matchad uppsättning, så du måste vara försiktig under säkerhetskopierings- och återställningsåtgärderna. Databasfilen innehåller information om den exakta versionen av loggfilen och databasen öppnas inte om den är kopplad till fel loggfil.
För att undvika att data skadas öppnas en databas i användarinstansen med exklusiv åtkomst. Om två olika användarinstanser delar samma databas på samma dator måste användaren på den första instansen stänga databasen innan den kan öppnas i en andra instans.
Scenarier för användarinstanser
Användarinstanser ger utvecklare av databasprogram ett SQL Server-datalager som inte är beroende av att utvecklare har administrativa konton på sina utvecklingsdatorer. Användarinstanser baseras på Access/Jet-modellen, där databasprogrammet helt enkelt ansluter till en fil, och användaren automatiskt har fullständig behörighet för alla databasobjekt utan att en systemadministratör behöver ingripa för att bevilja behörigheter. Den är avsedd att fungera i situationer där användaren körs under ett lua-konto (least-privilege user account) och inte har administratörsbehörighet på servern eller den lokala datorn, men ändå behöver skapa databasobjekt och program. Med användarinstanser kan användare skapa instanser vid körning som körs under användarens egen säkerhetskontext och inte i säkerhetskontexten för en mer privilegierad systemtjänst.
Viktigt!
Användarinstanser bör endast användas i scenarier där alla program som använder den är fullständigt betrodda.
Scenarier för användarinstanser är:
Alla program med en användare där delningsdata inte krävs.
ClickOnce-distribution. Om .NET Framework 2.0 (eller senare) och SQL Server Express redan är installerade på måldatorn kan installationspaketet som laddats ned till följd av en ClickOnce-åtgärd installeras och användas av icke-administratörsanvändare. Observera att en administratör måste installera SQL Server Express om det är en del av installationen. Mer information finns i ClickOnce Deployment for Windows Forms (ClickOnce-distribution för Windows-formulär).
Dedikerad ASP.NET värd med Windows-autentisering. En enskild SQL Server Express-instans kan finnas på ett intranät. Programmet ansluter med hjälp av ASPNET Windows-kontot, inte med hjälp av personifiering. Användarinstanser bör inte användas för scenarier med tredje part eller delad värd där alla program delar samma användarinstans och inte längre förblir isolerade från varandra.