所謂孤立帳戶,就是某個數據庫的帳戶只有用戶名而沒有登錄名,這樣的用戶在用戶庫的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 語句將數據庫所有者設置為有效登錄名,然后再添加數據庫關系圖支持對象 解決方法如下:
1設置兼容級別為90(2005為90) USE [master] GO EXEC dbo.sp_dbcmptlevel @dbname='數據庫名', @new_cmptlevel=90 GO
或是選責你還原的數據庫,點右鍵,選屬性->選項->兼容級別,選擇sqlserver2005(90) 然后確定,
這時,你在該數據庫下展開數據庫關系圖節點時會有個提示,"此數據庫缺少一個或多個使用數據庫關系圖所需的支持對象,是否創建",選擇是即可
2通過以上的方法操作,如果問題依然存在的話,按下列方法繼續
選擇你的數據庫,然后選擇"安全性"->"用戶",選擇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,操作如下:
1創建用戶B,再創建架構B; 2將架構A的權限賦給用戶B,取消用戶A擁有架構A的權限,刪除用戶A; 3將數據庫的所有屬於架構A的對象改為架構B,代碼如下: ALTER SCHEMA [新架構名] TRANSFER 舊架構名.[數據庫中的對象表或視圖或存儲過程]
ALTER SCHEMA [B] TRANSFER A.[對象1] ALTER SCHEMA [B] TRANSFER A.[對象2] ALTER SCHEMA [B] TRANSFER A.[對象n]
4刪除架構A