SQL Server 的用戶安全管理分兩層,整個SQL Server 服務器一層,每個數據庫一層。
- 在服務器層的帳號,叫登錄賬戶(SQL Server:服務器角色),可以設置它管理整個SQL Server服務器(開啟跟蹤,修改 Sql Server 安全配置,備份所有數據庫等)。
- 在數據庫一層,叫數據庫賬戶(SQL Server:數據庫角色),可以設置它對這個特定的數據庫有讀寫、修改表結構、存儲過程定義等權限。
登錄帳號對于服務器而言的,數據庫用戶是針對特定數據庫來講的。就相當于一個房間里放著很多保險柜,你有房門鑰匙了,必須得有每個保險柜的鑰匙才能從保險柜里取東西。登錄帳戶是房門鑰匙,數據庫用戶是保險柜鑰匙。
1. 什么是孤立用戶
如上述所述“登陸賬戶”和“數據庫賬戶”之間存在一層映射,如果數據庫“A”中有賬戶“cms”,但沒有“登陸賬戶”與其對應,那么“cms”賬戶就無法連接SQL Server服務,因此它就沒有任何作用,便成立一個孤立的用戶。
2. 什么情況下會產生孤立用戶
第一個服務器的情況:
- 數據庫A
- 數據庫A中有cms賬戶,并且也存在cms登陸賬戶
在第一個服務器中備份數據A,并在第二個服務器中還原該數據庫,那么第二個服務器的情況:
- 數據庫A
- 數據庫A中有cms賬戶,不存在與其對應的登陸賬戶
此時在第二個服務器的數據庫A中便產生了孤立賬戶cms,在第二個服務器中運行下述語句也可看到孤立賬戶cms:
Use A
exec sp_change_users_login 'report'
如果直接建立登陸賬戶“cms”,并制定其“數據庫訪問”為數據庫A,會提示“用戶**已存在”,如下圖:
3. 如何解決孤立用戶
解決孤立賬戶實質上就是建立一個“登陸賬戶”,并關聯“登陸賬戶”和“數據庫賬戶”。
建立一個登陸賬戶(一般與孤立賬戶同名,即“cms”),先不設置該“登陸賬戶”的數據庫訪問和數據角色,并設置該“登陸賬戶”的密碼(一般也與孤立賬戶相同),然后連接“登陸賬戶”和“數據庫賬戶”。
Use A
exec sp_change_users_login 'update_one', 'cms', 'cms'
這樣在執行“exec sp_change_users_login 'report'”就不會看到孤立賬戶“cms”了。
sp_change_users_login的語法
exec sp_change_users_login 'update_one', '登陸賬戶名', '數據庫賬戶名'
注意:“登陸賬戶”的賬戶名和密碼都可以和“孤立賬戶”不同,應用程序的數據庫配置應當為“登陸賬戶”的賬戶名和密碼,而不是“數據庫賬戶”。
4. 另一種解決辦法
假設數據A中存在孤立賬戶cms,其密碼為“123456”,應用程序的數據庫配置也是此。為了能夠使得應用程序能夠正常使用,可以做如下操作:
- 建立登陸賬戶“cms”,并設置密碼和默認數據庫分別為123456、cms
- 設置該登陸賬戶的“服務器角色”為“System Administrators”
- 不為該登陸賬戶設置相關“數據庫訪問”屬性
- 保存時會提示如下錯誤,不必理會
這種方法僅僅是建立了一個類似于sa的cms用戶,雖能夠保障應用程序正常使用,但并不能解決孤立用戶。
文章列表