孤立帳戶的產(chǎn)生一般是一下兩種:
1.將備份的數(shù)據(jù)庫在其它機(jī)器上還原;
2.重裝系統(tǒng)或SQL SERVER之后只還原了用戶庫
解決方法是使用sp_change_users_login來修復(fù)。
sp_change_users_login的用法有三種
用法1:
exec sp_change_users_login 'REPORT'
列出當(dāng)前數(shù)據(jù)庫的孤立用戶
用法2:
exec sp_change_users_login 'AUTO_FIX','用戶名'
可以自動將用戶名所對應(yīng)的同名登錄添加到syslogins中
用法3:
exec sp_change_users_login 'UPDATE_ONE','用戶名','登錄名'
將用戶名映射為指定的登錄名。
SQL孤立用戶解決方案
當(dāng)您將數(shù)據(jù)庫備份恢復(fù)到另一臺服務(wù)器時,可能會遇到孤立用戶的問題。SQL Server 聯(lián)機(jī)叢書中的孤立用戶疑難解答主題中沒有講述解決此問題的具體步驟。
雖然術(shù)語“登錄”和“用戶”經(jīng)常交換使用,但它們之間有很大的不同。登錄用于用戶身份驗證,而數(shù)據(jù)庫用戶帳戶用于數(shù)據(jù)庫訪問和權(quán)限驗證。登錄通過安全識別符 (SID) 與用戶關(guān)聯(lián)。訪問 SQL Server 服務(wù)器需要登錄。驗證特定登錄是否有效的過程稱為“身份驗證”。登錄必須與 SQL Server 數(shù)據(jù)庫用戶相關(guān)聯(lián)。您使用用戶帳戶控制數(shù)據(jù)庫中執(zhí)行的活動。如果數(shù)據(jù)庫中不存在針對特定登錄的用戶帳戶,使用該登錄的用戶即使能夠連接到 SQL Server 服務(wù)器,也無法訪問數(shù)據(jù)庫。但是,該情形的例外是當(dāng)數(shù)據(jù)庫包含“guest”用戶帳戶時。與用戶帳戶不關(guān)聯(lián)的登錄將被映射到 guest 用戶。相反,如果存在數(shù)據(jù)庫用戶,但沒有與其關(guān)聯(lián)的登錄,則該用戶將無法登錄到 SQL Server 服務(wù)器中。
將數(shù)據(jù)庫恢復(fù)到其他服務(wù)器時,數(shù)據(jù)庫中包含一組用戶和權(quán)限,但可能沒有相應(yīng)的登錄或者登錄所關(guān)聯(lián)的用戶可能不是相同的用戶。這種情況被稱為存在“孤立用戶”。
孤立用戶疑難解答
當(dāng)您將數(shù)據(jù)庫備份恢復(fù)到另一臺服務(wù)器時,可能會遇到孤立用戶的問題。以下情形說明了該問題并闡述如何加以解決。
1. 向主數(shù)據(jù)庫添加一個登錄,并將默認(rèn)數(shù)據(jù)庫指定為 Northwind: Use master go sp_addlogin 'test', 'password', 'Northwind'
2. 向剛創(chuàng)建的用戶授予訪問權(quán)限: Use Northwind go sp_grantdbaccess 'test'
3. 備份數(shù)據(jù)庫。 BACKUP DATABASE Northwind
TO DISK = 'C:MSSQLBACKUPNorthwind.bak'
4. 將數(shù)據(jù)庫恢復(fù)到其他 SQL Server 服務(wù)器: RESTORE DATABASE Northwind
FROM DISK = 'C:MSSQLBACKUPNorthwind.bak'
恢復(fù)的數(shù)據(jù)庫包含名為“test”的用戶,但沒有相應(yīng)的登錄,這就導(dǎo)致“test”成為孤立用戶。
5. 現(xiàn)在,為了檢測孤立用戶,請運(yùn)行此代碼: Use Northwind go sp_change_users_login 'report'
輸出中列出了所有登錄,其中包含 Northwind 數(shù)據(jù)庫的 sysusers 系統(tǒng)表和主數(shù)據(jù)庫的 sysxlogins 系統(tǒng)表中不匹配的條目。
解決孤立用戶問題的步驟
1. 為前一步中的孤立用戶運(yùn)行以下命令:
Use Northwind
go
sp_change_users_login 'update_one', 'test', 'test'
這樣,就將服務(wù)器登錄“test”與 Northwind 數(shù)據(jù)庫用戶“test”重新連接起來。
sp_change_users_login 存儲過程還可以使用“auto_fix”參數(shù)對所有孤立用戶執(zhí)行更新,但不推薦這樣做,因為 SQL Server 會嘗試按名稱匹配登錄和用戶。大多數(shù)情況下這都是可行的;但是,如果用戶與錯誤登錄關(guān)聯(lián),該用戶可能擁有錯誤的權(quán)限。
2. 在上一步中運(yùn)行代碼后,用戶就可以訪問數(shù)據(jù)庫了。然后用戶可以使用 sp_password 存儲過程更改密碼: Use master
go
sp_password NULL, 'ok', 'test'
此存儲過程不能用于 Microsoft Windows NT 安全帳戶。通過 Windows NT 網(wǎng)絡(luò)帳戶連接到 SQL Server 服務(wù)器的用戶是由 Windows NT 授權(quán)的;因此,這些用戶只能在 Windows NT 中更改密碼。
只有 sysadmin 角色的成員可以更改其他用戶的登錄密碼。
SQL2005刪除用戶的時候,產(chǎn)生“數(shù)據(jù)庫主體在該數(shù)據(jù)庫中擁有架構(gòu),無法刪除”的解決辦法
--執(zhí)行如下SQL語句
ALTER AUTHORIZATION ON SCHEMA::db_owner TO dbo;
--然后手動刪除就可以了。
[導(dǎo)入]sql2000備份的數(shù)據(jù)庫還原到sql2005后,選擇“數(shù)據(jù)庫關(guān)系圖”提示:此數(shù)據(jù)庫沒有有效所有者,因此無法安裝數(shù)據(jù)庫關(guān)系圖支持對象"的解決方法
sql2000備份的數(shù)據(jù)庫還原到sql2005后,選擇“數(shù)據(jù)庫關(guān)系圖”提示:此數(shù)據(jù)庫沒有有效所有者,因此無法安裝數(shù)據(jù)庫關(guān)系圖支持對象。若要繼續(xù),請首先使用“數(shù)據(jù)庫屬性”對話框的“文件”頁或 ALTER AUTHORIZATION 語句將數(shù)據(jù)庫所有者設(shè)置為有效登錄名,然后再添加數(shù)據(jù)庫關(guān)系圖支持對象。
解決方法如下:
1、設(shè)置兼容級別為90(2005為90)
USE [master]
GO
EXEC dbo.sp_dbcmptlevel @dbname='數(shù)據(jù)庫名', @new_cmptlevel=90
GO
或是選責(zé)你還原的數(shù)據(jù)庫,點(diǎn)右鍵,選屬性->選項->兼容級別,選擇sqlserver2005(90) 然后確定,
這時,你在該數(shù)據(jù)庫下展開“數(shù)據(jù)庫關(guān)系圖”節(jié)點(diǎn)時會有個提示,"此數(shù)據(jù)庫缺少一個或多個使用數(shù)據(jù)庫關(guān)系圖所需的支持對象,是否創(chuàng)建",選擇“是”即可。
2、通過以上的方法操作,如果問題依然存在的話,按下列方法繼續(xù)
選擇你的數(shù)據(jù)庫,然后選擇"安全性"->"用戶",選擇dbo,打開屬性頁,如登錄名為空的話,新建查詢,然后
use [你的數(shù)據(jù)庫名]
EXEC sp_changedbowner 'sa'
執(zhí)行成功后,你再選擇"數(shù)據(jù)庫關(guān)系圖"節(jié)點(diǎn),時提示 “此數(shù)據(jù)庫缺少一個或多個使用數(shù)據(jù)庫關(guān)系圖所需的支持對象,是否創(chuàng)建",選擇“是”即可。 就可以看到原先建的關(guān)系圖了。
從服務(wù)器上作導(dǎo)入導(dǎo)出至本地機(jī)上,數(shù)據(jù)庫中的表都在,可是表名前段的架構(gòu)身份不是“dbo”了,而是服務(wù)器上數(shù)據(jù)庫的“庫名”。這樣架構(gòu)身份不同了,程序運(yùn)行就出問題了。試過單個修改表,在sql2005的屬性窗口可以更改架構(gòu)者,可是N多表哪兒能手動改得過來呀!還請高手指點(diǎn)批量更改的方法。在此謝過。
SQL Server2005可以使用系統(tǒng)存儲過程sp_changeobjectowner更改數(shù)據(jù)庫對象的所有者。
sp_changeobjectowner '對象名(包括架構(gòu)名)','新架構(gòu)名'
批量修改請用:
方法一:使用游標(biāo)
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='原架構(gòu)名.'+@name EXEC SP_ChangeObjectOwner @name, '新架構(gòu)名' fetch next from csr1 into @name END CLOSE csr1 DEALLOCATE csr1 方法二:使用系統(tǒng)存儲過程sp_MSforeachtable
EXEC sp_MSforeachtable @command1="EXEC SP_ChangeObjectOwner '?','新架構(gòu)名'"
在sql server 2005數(shù)據(jù)庫中更改數(shù)據(jù)架構(gòu)
在數(shù)據(jù)庫testDB中存在架構(gòu)A及用戶A,現(xiàn)將testDB數(shù)據(jù)庫所屬的用戶由A改為B,同時刪除用戶A;架構(gòu)也由A改為B,刪除架構(gòu)A,操作如下:
1、創(chuàng)建用戶B,再創(chuàng)建架構(gòu)B;
2、將架構(gòu)A的權(quán)限賦給用戶B,取消用戶A擁有架構(gòu)A的權(quán)限,刪除用戶A;
3、將數(shù)據(jù)庫的所有屬于架構(gòu)A的對象改為架構(gòu)B,代碼如下:
ALTER SCHEMA [新架構(gòu)名] TRANSFER 舊架構(gòu)名.[數(shù)據(jù)庫中的對象表或視圖或存儲過程]
ALTER SCHEMA [B] TRANSFER A.[對象1]
ALTER SCHEMA [B] TRANSFER A.[對象2]
ALTER SCHEMA [B] TRANSFER A.[對象n]
1.將備份的數(shù)據(jù)庫在其它機(jī)器上還原;
2.重裝系統(tǒng)或SQL SERVER之后只還原了用戶庫
解決方法是使用sp_change_users_login來修復(fù)。
sp_change_users_login的用法有三種
用法1:
exec sp_change_users_login 'REPORT'
列出當(dāng)前數(shù)據(jù)庫的孤立用戶
用法2:
exec sp_change_users_login 'AUTO_FIX','用戶名'
可以自動將用戶名所對應(yīng)的同名登錄添加到syslogins中
用法3:
exec sp_change_users_login 'UPDATE_ONE','用戶名','登錄名'
將用戶名映射為指定的登錄名。
SQL孤立用戶解決方案
當(dāng)您將數(shù)據(jù)庫備份恢復(fù)到另一臺服務(wù)器時,可能會遇到孤立用戶的問題。SQL Server 聯(lián)機(jī)叢書中的孤立用戶疑難解答主題中沒有講述解決此問題的具體步驟。
雖然術(shù)語“登錄”和“用戶”經(jīng)常交換使用,但它們之間有很大的不同。登錄用于用戶身份驗證,而數(shù)據(jù)庫用戶帳戶用于數(shù)據(jù)庫訪問和權(quán)限驗證。登錄通過安全識別符 (SID) 與用戶關(guān)聯(lián)。訪問 SQL Server 服務(wù)器需要登錄。驗證特定登錄是否有效的過程稱為“身份驗證”。登錄必須與 SQL Server 數(shù)據(jù)庫用戶相關(guān)聯(lián)。您使用用戶帳戶控制數(shù)據(jù)庫中執(zhí)行的活動。如果數(shù)據(jù)庫中不存在針對特定登錄的用戶帳戶,使用該登錄的用戶即使能夠連接到 SQL Server 服務(wù)器,也無法訪問數(shù)據(jù)庫。但是,該情形的例外是當(dāng)數(shù)據(jù)庫包含“guest”用戶帳戶時。與用戶帳戶不關(guān)聯(lián)的登錄將被映射到 guest 用戶。相反,如果存在數(shù)據(jù)庫用戶,但沒有與其關(guān)聯(lián)的登錄,則該用戶將無法登錄到 SQL Server 服務(wù)器中。
將數(shù)據(jù)庫恢復(fù)到其他服務(wù)器時,數(shù)據(jù)庫中包含一組用戶和權(quán)限,但可能沒有相應(yīng)的登錄或者登錄所關(guān)聯(lián)的用戶可能不是相同的用戶。這種情況被稱為存在“孤立用戶”。
孤立用戶疑難解答
當(dāng)您將數(shù)據(jù)庫備份恢復(fù)到另一臺服務(wù)器時,可能會遇到孤立用戶的問題。以下情形說明了該問題并闡述如何加以解決。
1. 向主數(shù)據(jù)庫添加一個登錄,并將默認(rèn)數(shù)據(jù)庫指定為 Northwind: Use master go sp_addlogin 'test', 'password', 'Northwind'
2. 向剛創(chuàng)建的用戶授予訪問權(quán)限: Use Northwind go sp_grantdbaccess 'test'
3. 備份數(shù)據(jù)庫。 BACKUP DATABASE Northwind
TO DISK = 'C:MSSQLBACKUPNorthwind.bak'
4. 將數(shù)據(jù)庫恢復(fù)到其他 SQL Server 服務(wù)器: RESTORE DATABASE Northwind
FROM DISK = 'C:MSSQLBACKUPNorthwind.bak'
恢復(fù)的數(shù)據(jù)庫包含名為“test”的用戶,但沒有相應(yīng)的登錄,這就導(dǎo)致“test”成為孤立用戶。
5. 現(xiàn)在,為了檢測孤立用戶,請運(yùn)行此代碼: Use Northwind go sp_change_users_login 'report'
輸出中列出了所有登錄,其中包含 Northwind 數(shù)據(jù)庫的 sysusers 系統(tǒng)表和主數(shù)據(jù)庫的 sysxlogins 系統(tǒng)表中不匹配的條目。
解決孤立用戶問題的步驟
1. 為前一步中的孤立用戶運(yùn)行以下命令:
Use Northwind
go
sp_change_users_login 'update_one', 'test', 'test'
這樣,就將服務(wù)器登錄“test”與 Northwind 數(shù)據(jù)庫用戶“test”重新連接起來。
sp_change_users_login 存儲過程還可以使用“auto_fix”參數(shù)對所有孤立用戶執(zhí)行更新,但不推薦這樣做,因為 SQL Server 會嘗試按名稱匹配登錄和用戶。大多數(shù)情況下這都是可行的;但是,如果用戶與錯誤登錄關(guān)聯(lián),該用戶可能擁有錯誤的權(quán)限。
2. 在上一步中運(yùn)行代碼后,用戶就可以訪問數(shù)據(jù)庫了。然后用戶可以使用 sp_password 存儲過程更改密碼: Use master
go
sp_password NULL, 'ok', 'test'
此存儲過程不能用于 Microsoft Windows NT 安全帳戶。通過 Windows NT 網(wǎng)絡(luò)帳戶連接到 SQL Server 服務(wù)器的用戶是由 Windows NT 授權(quán)的;因此,這些用戶只能在 Windows NT 中更改密碼。
只有 sysadmin 角色的成員可以更改其他用戶的登錄密碼。
SQL2005刪除用戶的時候,產(chǎn)生“數(shù)據(jù)庫主體在該數(shù)據(jù)庫中擁有架構(gòu),無法刪除”的解決辦法
--執(zhí)行如下SQL語句
ALTER AUTHORIZATION ON SCHEMA::db_owner TO dbo;
--然后手動刪除就可以了。
[導(dǎo)入]sql2000備份的數(shù)據(jù)庫還原到sql2005后,選擇“數(shù)據(jù)庫關(guān)系圖”提示:此數(shù)據(jù)庫沒有有效所有者,因此無法安裝數(shù)據(jù)庫關(guān)系圖支持對象"的解決方法
sql2000備份的數(shù)據(jù)庫還原到sql2005后,選擇“數(shù)據(jù)庫關(guān)系圖”提示:此數(shù)據(jù)庫沒有有效所有者,因此無法安裝數(shù)據(jù)庫關(guān)系圖支持對象。若要繼續(xù),請首先使用“數(shù)據(jù)庫屬性”對話框的“文件”頁或 ALTER AUTHORIZATION 語句將數(shù)據(jù)庫所有者設(shè)置為有效登錄名,然后再添加數(shù)據(jù)庫關(guān)系圖支持對象。
解決方法如下:
1、設(shè)置兼容級別為90(2005為90)
USE [master]
GO
EXEC dbo.sp_dbcmptlevel @dbname='數(shù)據(jù)庫名', @new_cmptlevel=90
GO
或是選責(zé)你還原的數(shù)據(jù)庫,點(diǎn)右鍵,選屬性->選項->兼容級別,選擇sqlserver2005(90) 然后確定,
這時,你在該數(shù)據(jù)庫下展開“數(shù)據(jù)庫關(guān)系圖”節(jié)點(diǎn)時會有個提示,"此數(shù)據(jù)庫缺少一個或多個使用數(shù)據(jù)庫關(guān)系圖所需的支持對象,是否創(chuàng)建",選擇“是”即可。
2、通過以上的方法操作,如果問題依然存在的話,按下列方法繼續(xù)
選擇你的數(shù)據(jù)庫,然后選擇"安全性"->"用戶",選擇dbo,打開屬性頁,如登錄名為空的話,新建查詢,然后
use [你的數(shù)據(jù)庫名]
EXEC sp_changedbowner 'sa'
執(zhí)行成功后,你再選擇"數(shù)據(jù)庫關(guān)系圖"節(jié)點(diǎn),時提示 “此數(shù)據(jù)庫缺少一個或多個使用數(shù)據(jù)庫關(guān)系圖所需的支持對象,是否創(chuàng)建",選擇“是”即可。 就可以看到原先建的關(guān)系圖了。
從服務(wù)器上作導(dǎo)入導(dǎo)出至本地機(jī)上,數(shù)據(jù)庫中的表都在,可是表名前段的架構(gòu)身份不是“dbo”了,而是服務(wù)器上數(shù)據(jù)庫的“庫名”。這樣架構(gòu)身份不同了,程序運(yùn)行就出問題了。試過單個修改表,在sql2005的屬性窗口可以更改架構(gòu)者,可是N多表哪兒能手動改得過來呀!還請高手指點(diǎn)批量更改的方法。在此謝過。
SQL Server2005可以使用系統(tǒng)存儲過程sp_changeobjectowner更改數(shù)據(jù)庫對象的所有者。
sp_changeobjectowner '對象名(包括架構(gòu)名)','新架構(gòu)名'
批量修改請用:
方法一:使用游標(biāo)
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='原架構(gòu)名.'+@name EXEC SP_ChangeObjectOwner @name, '新架構(gòu)名' fetch next from csr1 into @name END CLOSE csr1 DEALLOCATE csr1 方法二:使用系統(tǒng)存儲過程sp_MSforeachtable
EXEC sp_MSforeachtable @command1="EXEC SP_ChangeObjectOwner '?','新架構(gòu)名'"
在sql server 2005數(shù)據(jù)庫中更改數(shù)據(jù)架構(gòu)
在數(shù)據(jù)庫testDB中存在架構(gòu)A及用戶A,現(xiàn)將testDB數(shù)據(jù)庫所屬的用戶由A改為B,同時刪除用戶A;架構(gòu)也由A改為B,刪除架構(gòu)A,操作如下:
1、創(chuàng)建用戶B,再創(chuàng)建架構(gòu)B;
2、將架構(gòu)A的權(quán)限賦給用戶B,取消用戶A擁有架構(gòu)A的權(quán)限,刪除用戶A;
3、將數(shù)據(jù)庫的所有屬于架構(gòu)A的對象改為架構(gòu)B,代碼如下:
ALTER SCHEMA [新架構(gòu)名] TRANSFER 舊架構(gòu)名.[數(shù)據(jù)庫中的對象表或視圖或存儲過程]
ALTER SCHEMA [B] TRANSFER A.[對象1]
ALTER SCHEMA [B] TRANSFER A.[對象2]
ALTER SCHEMA [B] TRANSFER A.[對象n]