文章出處

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用戶,雖能夠保障應用程序正常使用,但并不能解決孤立用戶。


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


全站熱搜
創作者介紹
創作者 大師兄 的頭像
大師兄

IT工程師數位筆記本

大師兄 發表在 痞客邦 留言(0) 人氣()