許多互聯網創業者需要“綜合素質”,SQL中不乏會遇到一些問題,這也是自己曾遇到的問題之一,共享。
問題原因:
把數據庫備份還原到另一個服務器時,可能會產生孤立用戶的問題;
解決辦法:
步驟:1.把備份的數據庫還原到新的數據庫服務器中(
1.1企業管理器-->1.2數據庫(右鍵)-->1.3所有任務-->1.4還原數據庫-->1.5常規/還原為數據庫/寫上你要的數據庫名字xxxx/選中從設備/選擇設備/添加(瀏覽找到你的數據庫備份文件)/確定/確定/確定-->1.6選項-->1.7將數據庫還原為f:\usr\xxxx.mdf一般存放在你sql安裝的目錄下如:d:\Program Files\Microsoft SQL Server\MSSQL\Data\xxxx.mdf-->1.8確定就ok了!!
2. 查看你剛剛還原的數據庫中的用戶如:abc;
3. 查看安全性下面的登陸用戶中是否有:abc如果沒有此時的abc就是一個孤立用戶;
4.打開查詢分析器運行腳本
use 數據庫名
go
DECLARE @sid BINARY(16)
SELECT @sid=sid FROM sysusers WHERE name='abc' and islogin=1
exec sp_addlogin @loginame = 'abc',@sid = @sid
5.注意,應該是先還原,如果事先在sql的安全性--登錄中已經
創建abc這個登錄,則先刪除它,再執行上面的語句.同過上面的就能解決問題了!
======================================================================
總結:孤立用戶疑難解答
把數據庫備份還原到另一個服務器時,可能會遇到孤立用戶的問題。下面的方案顯示解決了這個問題:
通過執行sp_addlogin,把登錄 janetl 改名為 dbo。
sp_addlogin 'janetl', 'dbo'
備份數據庫。在本例中,備份 Northwind。
BACKUP DATABASE Northwind
TO DISK = 'c:\mssql\backup\northwnd'
除去剛剛備份的數據庫。
DROP DATABASE Northwind
除去登錄。
sp_droplogin 'janetl'
還原備份的數據庫。
RESTORE DATABASE Northwind
FROM DISK = 'c:\mssql\backup\northwnd'
janetl 登錄不能訪問 Northwind 數據庫,除非允許 guest 登錄。盡管 janetl 登錄已經刪除,
它仍然(作為一個孤立行)顯示在 sysusers 表中:
USE Northwind
SELECT *
FROM sysusers
WHERE name = 'janetl'
解決孤立用戶問題
用 sp_addlogin 添加一個臨時登錄。為孤立用戶指定安全標識符(SID)(從 sysusers)。
sp_addlogin @loginame = 'nancyd',@sid = 0x32C864A70427D211B4DD00104B9E8A00
用 sp_dropalias 除去屬于別名 SID 的臨時別名。
sp_dropalias 'nancyd'
用 sp_dropuser 除去原始用戶(即現在的孤立用戶)。
sp_dropuser 'janetl'
用 sp_dropuser 除去原始登錄。
sp_droplogin 'nancyd'
========================================
--孤立用戶的產生演示
--創建一個測試的數據庫
CREATE DATABASE DB_test
go
--創建一個登錄
EXEC sp_addlogin 'aa'
--設置登錄 aa 的默認數據庫為測試數據庫 DB_test
EXEC sp_defaultdb 'aa','DB_test'
go
--切換到測試數據庫
USE DB_test
go
--為登錄 aa 在當前測試數據庫中添加用戶
EXEC sp_grantdbaccess 'aa'
go
--至此,用戶 aa 登錄后,其默認的當前數據庫就是 DB_test
--我們可以在查詢分析器,使用用戶 aa 登錄一下,來驗證我們的測試環境
--備份測試數據庫,為下面的測試做準備
BACKUP DATABASE DB_test TO DISK='c:\DB_test.bak' WITH INIT
go
/*=================== 產生孤立用戶 ======================*/
--切換到 master 數據庫
USE master
go
--刪除測試數據庫
DROP DATABASE DB_test
go
--刪除登錄 aa
EXEC sp_droplogin 'aa'
go
/*=================== 孤立用戶表現形式1 ======================*/
--還原測試數據庫
RESTORE DATABASE DB_test FROM DISK='c:\DB_test.bak'
go
--切換到測試數據庫
USE DB_test
go
--查看用戶信息
select name from sysusers where islogin=1
--我們會發現,雖然我們已經將登錄 aa 刪除了,但用戶 aa 仍然存在于數據庫中
--嘗試一下,用 aa 登錄,被告知登錄失敗
go
--再把刪除的登錄添加回去
EXEC sp_addlogin 'aa'
--設置登錄 aa 的默認數據庫為測試數據庫 DB_test
EXEC sp_defaultdb 'aa','DB_test'
--再次登錄,被告知無法打開默認數據庫,登錄失敗
go
--于是把默認數據庫改為 master
EXEC sp_defaultdb 'aa','master'
--這次再登錄,就可以登錄了
go
--嘗試切換到測試數據庫 DB_test
USE DB_test
--得到錯誤信息: 服務器用戶 'aa' 不是數據庫 'DB_test' 中的有效用戶。
--看來用戶 aa 與登錄 aa 失去了聯系
go
--嘗試重新為登錄 aa 添加用戶 aa
EXEC sp_grantdbaccess 'aa'
--得到錯誤信息:當前數據庫中已存在用戶或角色 'aa'。
--這次我們換個順序,先建立登錄,再恢復數據庫,看能否使登錄與用戶自動建立回聯系
--做這個測試之前,先清理測試環境,即做前面的<產生孤立用戶>步驟,然后再開始測試
--先添加登錄
EXEC sp_addlogin 'aa'
go
--還原測試數據庫
RESTORE DATABASE DB_test FROM DISK='c:\DB_test.bak'
go
--切換到測試數據庫
USE DB_test
go
--查看用戶信息
select name from sysusers where islogin=1
--我們會發現,用戶 aa 存在于數據庫中
--嘗試一下,用 aa 登錄,并切換到 DB_test
--結果是登錄成功,訪問 DB_test 出現和測試1一樣的錯誤
◎歡迎參與討論,請在這里發表您的看法、交流您的觀點。