SQL還原數據庫後孤立用戶問題處理

     使用sp_change_users_login排除孤立用戶,所謂孤立賬戶,就是某個數據庫的賬戶只有用戶名而沒有登陸名,這樣的用戶在用戶庫的sysusers系統表中存在,而在master數據庫的syslogins中卻沒有對應的記錄。
孤立賬戶的產生通常是一下兩種:
1.將備份的數據庫在其它機器上還原;
2.重裝系統或SQL SERVER以後只還原了用戶庫
解決方法是使用sp_change_users_login來修復。
sp_change_users_login的用法有三種
用法1:
exec sp_change_users_login 'REPORT'
列出當前數據庫的孤立用戶
用法2:
exec sp_change_users_login 'AUTO_FIX','用戶名'
能夠自動將用戶名所對應的同名登陸添加到syslogins中
用法3:
exec sp_change_users_login 'UPDATE_ONE','用戶名','登陸名'
將用戶名映射爲指定的登陸名。
----------------------------------------------------------------------------------------------------------------
看看是否有用

SQL孤立用戶解決方案  

症狀
  當您將數據庫備份恢復到另外一臺服務器時,可能會遇到孤立用戶的問題。SQL Server 聯機叢書中的孤立用戶疑難解答主題中沒有講述解決此問題的具體步驟。
  本文介紹瞭如何解決孤立用戶問題。
  狀態
  Microsoft 已經確認這是在本文開頭列出的 Microsoft 產品中存在的問題。
  更多信息
  雖然術語「登陸」和「用戶」常常交換使用,但它們之間有很大的不一樣。登陸用於用戶身份驗證,而數據庫用戶賬戶用於數據庫訪問和權限驗證。登陸經過安全識別符 (SID) 與用戶關聯。訪問 SQL Server 服務器須要登陸。驗證特定登陸是否有效的過程稱爲「身份驗證」。登陸必須與 SQL Server 數據庫用戶相關聯。您使用用戶賬戶控制數據庫中執行的活動。若是數據庫中不存在針對特定登陸的用戶賬戶,使用該登陸的用戶即便可以鏈接到 SQL Server 服務器,也沒法訪問數據庫。可是,該情形的惟一例外是當數據庫包含「guest」用戶賬戶時。與用戶賬戶不關聯的登陸將被映射到 guest 用戶。相反,若是存在數據庫用戶,但沒有與其關聯的登陸,則該用戶將沒法登陸到 SQL Server 服務器中。
  將數據庫恢復到其餘服務器時,數據庫中包含一組用戶和權限,但可能沒有相應的登陸或者登陸所關聯的用戶可能不是相同的用戶。這種狀況被稱爲存在「孤立用戶」。
  孤立用戶疑難解答
  當您將數據庫備份恢復到另外一臺服務器時,可能會遇到孤立用戶的問題。如下情形說明了該問題並闡述如何加以解決。
  1. 向主數據庫添加一個登陸,並將默認數據庫指定爲 Northwind: Use master go sp_addlogin 'test', 'password', 'Northwind'
  2. 向剛建立的用戶授予訪問權限: Use Northwind go sp_grantdbaccess 'test'
  3. 備份數據庫。 BACKUP DATABASE Northwind
TO DISK = 'C:MSSQLBACKUPNorthwind.bak'
  4. 將數據庫恢復到其餘 SQL Server 服務器: RESTORE DATABASE Northwind
FROM DISK = 'C:MSSQLBACKUPNorthwind.bak'
     
  恢復的數據庫包含名爲「test」的用戶,但沒有相應的登陸,這就致使「test」成爲孤立用戶。
  5. 如今,爲了檢測孤立用戶,請運行此代碼: Use Northwind go sp_change_users_login 'report'
     
  輸出中列出了全部登陸,其中包含 Northwind 數據庫的 sysusers 系統表和主數據庫的 sysxlogins 系統表中不匹配的條目。
  解決孤立用戶問題的步驟
  1. 爲前一步中的孤立用戶運行如下命令:
Use Northwind
go
sp_change_users_login 'update_one', 'test', 'test'
     
  這樣,就將服務器登陸「test」與 Northwind 數據庫用戶「test」從新鏈接起來。
  sp_change_users_login 存儲過程還可使用「auto_fix」參數對全部孤立用戶執行更新,但不推薦這樣作,由於 SQL Server 會嘗試按名稱匹配登陸和用戶。大多數狀況下這都是可行的;可是,若是用戶與錯誤登陸關聯,該用戶可能擁有錯誤的權限。
  2. 在上一步中運行代碼後,用戶就能夠訪問數據庫了。而後用戶可使用 sp_password 存儲過程更改密碼: Use master
go
sp_password NULL, 'ok', 'test'
     
  此存儲過程不能用於 Microsoft Windows NT 安全賬戶。經過 Windows NT 網絡賬戶鏈接到 SQL Server 服務器的用戶是由 Windows NT 受權的;所以,這些用戶只能在 Windows NT 中更改密碼。
  只有 sysadmin 角色的成員能夠更改其餘用戶的登陸密碼。
----------------------------------------------------------------------------------------------------------------
SQL2005刪除用戶的時候,產生「數據庫主體在該數據庫中擁有架構,沒法刪除」的解決辦法
--執行以下SQL語句
ALTER   AUTHORIZATION   ON   SCHEMA::db_owner   TO   dbo;
--而後手動刪除就能夠了。

----------------------------------------------------------------------------------------------------------------
[導入]sql2000備份的數據庫還原到sql2005後,選擇「數據庫關係圖」提示:此數據庫沒有有效全部者,所以沒法安裝數據庫關係圖支持對象"的解決方法
sql2000備份的數據庫還原到sql2005後,選擇「數據庫關係圖」提示:此數據庫沒有有效全部者,所以沒法安裝數據庫關係圖支持對象。若要繼續,請首先使用「數據庫屬性」對話框的「文件」頁或 ALTER AUTHORIZATION 語句將數據庫全部者設置爲有效登陸名,而後再添加數據庫關係圖支持對象。
    
解決方法以下:
一、設置兼容級別爲90(2005爲90)
USE [master]
GO
EXEC dbo.sp_dbcmptlevel @dbname='數據庫名', @new_cmptlevel=90
GO  
或是選責你還原的數據庫,點右鍵,選屬性->選項->兼容級別,選擇sqlserver2005(90) 而後肯定,
      這時,你在該數據庫下展開「數據庫關係圖」節點時會有個提示,"此數據庫缺乏一個或多個使用數據庫關係圖所需的支持對象,是否建立",選擇「是」便可。
二、經過以上的方法操做,若是問題依然存在的話,按下列方法繼續
選擇你的數據庫,而後選擇"安全性"->"用戶",選擇dbo,打開屬性頁,如登陸名爲空的話,新建查詢,而後
use [你的數據庫名]
EXEC   sp_changedbowner   'sa'
執行成功後,你再選擇"數據庫關係圖"節點,時提示 「此數據庫缺乏一個或多個使用數據庫關係圖所需的支持對象,是否建立",選擇「是」便可。 就能夠看到原先建的關係圖了。

----------------------------------------------------------------------------------------------------------------

從服務器上做導入導出至本地機上,數據庫中的表都在,但是表名前段的架構身份不是「dbo」了,而是服務器上數據庫的「庫名」。這樣架構身份不一樣了,程序運行就出問題了。試過單個修改表,在sql2005的屬性窗口能夠更改架構者,但是N多表哪兒能手動改得過來呀!還請高手指點批量更改的方法。在此謝過。
SQL   Server2005可使用系統存儲過程sp_changeobjectowner更改數據庫對象的全部者。  
   
sp_changeobjectowner   '對象名(包括架構名)','新架構名'  
   
批量修改請用:  
   
方法一:使用遊標  
   
declare   @name   sysname  
declare   csr1   cursor  
for    
      select   TABLE_NAME   from   INFORMATION_SCHEMA.TABLES  
open   csr1  
   
FETCH   NEXT   FROM   csr1   INTO   @name  
while   (@@FETCH_STATUS=0)  
      BEGIN  
SET   @name='原架構名 .'+@name  
                  EXEC   SP_ChangeObjectOwner   @name,   '新架構名'  
    fetch   next   from   csr1   into   @name  
      END  
CLOSE   csr1  
DEALLOCATE   csr1  
   
方法二:使用系統存儲過程sp_MSforeachtable  
EXEC   sp_MSforeachtable   @command1="EXEC   SP_ChangeObjectOwner   '?','新架構名'"
----------------------------------------------------------------------------------------------------------------
在sql server 2005數據庫中更改數據架構
在數據庫testDB中存在架構A及用戶A,現將testDB數據庫所屬的用戶由A改成B,同時刪除用戶A;架構也由A改成B,刪除架構A,操做以下:
一、建立用戶B,再建立架構B;
二、將架構A的權限賦給用戶B,取消用戶A擁有架構A的權限,刪除用戶A;
三、將數據庫的全部屬於架構A的對象改成架構B,代碼以下:
ALTER SCHEMA [新架構名] TRANSFER 舊架構名.[數據庫中的對象表或視圖或存儲過程]
ALTER SCHEMA [B] TRANSFER A.[對象1] ALTER SCHEMA [B] TRANSFER A.[對象2] ALTER SCHEMA [B] TRANSFER A.[對象n]
相關文章
相關標籤/搜索