Share via


非管理員的使用者執行個體

使用者執行個體是讓非管理員可以在他們自己的帳戶中執行本機版 SQL Server 的功能。  有了使用者執行個體,非管理員對於在他們自己的帳戶中執行的執行個體就具有資料庫擁有者權限。 

重要注意事項重要事項

未來的 Microsoft SQL Server 版本將移除這項功能。請避免在新的開發工作中使用這項功能,並規劃修改目前使用這項功能的應用程式。

使用者執行個體 (也稱為子系或用戶端執行個體) 是父執行個體 (以服務執行的主要執行個體,例如 sqlExpress) 代表使用者所產生的 SQL Server 執行個體。使用者執行個體是在該使用者的安全性內容下,以使用者處理序的形式執行。使用者執行個體與父執行個體隔離,也與電腦上執行的其他任何使用者執行個體隔離。使用者執行個體功能也稱為「以一般使用者身分執行」(RANU)。

[!附註]

為求一致,《SQL Server Express 線上叢書》統一將這項功能稱為使用者執行個體。而且,SQL Server 2005 Express Edition 引進了這項功能。

為何需要使用者執行個體?

以下列出部份理由,說明利用使用者執行個體模式的好處:

  • 使用者執行個體模式的主要目標是要隔離 SQL Server 的非管理員使用者,以便讓使用者能夠附加任意資料庫,又不會危害其他的使用者。您可藉由為每個使用者產生個別的 SQL Server 執行個體,來達成這個隔離的目標。

  • 除了隔離以外,SQL Server Express 還有另外一個目標,就是要讓非管理員使用者能夠輕鬆使用。許多 Windows 使用者都擁有含管理權限的帳戶。可惜的是,以管理員身分執行很容易讓惡意軟體控制使用者的電腦。不過,由非管理員使用者執行的惡意軟體不能進行全系統的變更,因此只會造成有限的損毀。

使用者執行個體概觀

使用者執行個體模式的重點摘要如下:

  • SQL Server 的父執行個體必須在執行中才能產生使用者執行個體。

  • 每當您安裝 SQL Server Express 時,安裝程式都會建立一個 Template Data 資料夾,以儲存叫用使用者執行個體處理序時所要取用的乾淨系統資料庫。

  • 若要叫用使用者執行個體,請使用 SQLClient 中的 user instance 連接字串關鍵字 (可以是 true 或 false,預設值是 false)。設定為 false 時,不會有任何使用者執行個體產生作用,而會保留原來的行為。如果 user instance 設定為 true,ADO. NET connection.open 呼叫期間便會啟動使用者執行個體模式。

    [!附註]

    System.Data.SqlClient 命名空間定義一組可讓您存取 SQL Server 資料庫的類別集合,這組類別集合統稱為 .NET Data Provider for SQL Server 或 SqlClient。Managed 應用程式可透過 ADO .NET API 與 SqlClient 互動,以查詢及管理儲存在 SQL Server 資料庫的資料和結構描述資訊。如需詳細資訊,請參閱 Visual Studio 2005 文件。

  • 第一次產生任一使用者的使用者執行個體時,會從 Template Data 資料夾將系統資料庫複製到使用者本機應用程式資料儲存機制目錄,供使用者執行個體獨佔使用。這個路徑通常是:磁碟機:\Documents and Settings\Username\Local Settings\Application Data\Microsoft\Microsoft SQL Server Data\SQLEXPRESS。

  • 使用者會以 SysAdmin 的身分連接到這個新的使用者執行個體並使用資料庫,即使該使用者並非父執行個體上的管理員也一樣。

    安全性注意事項安全性注意事項

    在安裝期間提供為系統管理員 (sysadmin) 固定伺服器角色成員的登入會在範本資料庫中提供為管理員。除非移除這些登入,否則它們就是使用者執行個體上系統管理員 (sysadmin) 固定伺服器角色的成員。

  • 產生使用者執行個體時, SQLClient 會將所有呼叫重新導向至使用者執行個體。

[!附註]

使用者資料庫會根據資料庫主要檔案的檔案系統屬性和使用權限,來衍生其 READONLY 屬性。ALTER DATABASE SET READ_ONLY/READ_WRITE 設定並不適用。

使用使用者執行個體的連接字串

conn string =
"Data Source=.\\SQLExpress" +
"integrated security=true;" + 
"attachdbfilename=|DataDirectory|\mydb.mdf;" +
"user instance=true"
string connstr = GetConnectionString(); // get from config
using(SqlConnection conn = new SqlConnection(connstr)) {
  // this will connect to the user instance, not to the 
  // default SSE instance
  conn.Open();
  // use the connection to the user instance
}

連接到使用者執行個體

使用者執行個體的網路通訊協定支援只能透過本機具名管道取得,這表示使用者無法從遠端電腦連接到使用者執行個體。

如需有關使用 SQL Server Management Studio 連接到使用者執行個體的詳細資訊,請參閱《SQL Server Express 線上叢書》中的<SQL Server Management Studio 和 SQL Server Express>。

[!附註]

如需具名管道或網路通訊協定的詳細資訊,請參閱 SQL Server 組態管理員說明。若要存取此說明,請在 [開始] 功能表中按一下 [執行],然後輸入 SQLServerManager.msc。這個動作會開啟 [SQL Server 組態管理員]。若要存取說明,請按一下 [說明] 功能表。若要查看 SQL Server 的網路通訊協定,請按一下 [SQL Server 網路組態]

使用者執行個體的管理

如果您是管理員,而且想要管理使用者執行個體,下列資訊將非常有用。

檢視表/預存程序/Transact-SQL

說明

sys.dm_os_child_instances (Transact-SQL) 選取 *

可讓您執行虛擬檢視表,以列出父執行個體上產生的所有使用者執行個體。

SHUTDOWN

停止 SQL Server。請使用這個命令來停止使用者執行個體。如需有關如何使用 SHUTDOWN 的詳細資訊,請參閱《SQL Server 線上叢書》中的<SHUTDOWN (Transact-SQL)>。

sp_configure 'user instances enabled'

控制使用者執行個體功能的啟用或停用。

若要啟用使用者執行個體的產生功能,請使用:

sp_configure 'user instances enabled','1' 

RECONFIGURE;

GO

若要停用使用者執行個體的產生功能,請使用:

sp_configure 'user instances enabled','0'.

sp_configure 'user instance timeout'

請使用:

sp_configure 'show advanced options', 1;

RECONFIGURE;

GO

sp_configure 'user instance timeout', 5;

GO

其中 5 是最小值,而 65535 則是最大值。

您必須使用 sp_configure 'show advanced options' 才能檢視及設定逾時值。如需有關 show advanced options 的詳細資訊,請參閱《SQL Server 線上叢書》中的<設定伺服器組態選項>。

您可以在父執行個體和使用者執行個體中設定使用者執行個體逾時值。

當使用者執行個體啟動時,都會從父執行個體取得逾時值。不過,一旦使用者執行個體啟動之後,它就可以使用 sp_configure 變更只對此特定執行個體有效的逾時值。

使用者執行個體的使用限制

使用使用者執行個體時,某些 SQL Server Express 功能可能無法如預期地運作。下列清單描述可能產生的限制:

  • 一個使用者只能有一個使用者執行個體。

  • 將會停用複寫。

  • 使用者執行個體不支援 SQL Server 驗證,只支援 Windows 驗證。

  • 使用者執行個體的網路通訊協定支援只有本機具名管道。

  • 使用者執行個體會共用父執行個體的登錄項目。

  • 不支援具有機器碼的使用者執行個體。只有 ADO .NET 才能支援這項功能。

  • SQL Server Express 使用者執行個體上不支援全文檢索搜尋。

  • 動態繁衍的使用者執行個體無法支援伺服器事件的 WMI 提供者。這在父 SQL Server Express 執行個體上應該還是有效。如需有關 WMI 提供者的詳細資訊,請參閱《SQL Server 線上叢書》中的<伺服器事件的 WMI 提供者>。