国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > SQL Server > 正文

在SQL Server實例之間傳輸登錄和密碼

2024-08-31 00:45:52
字體:
來源:轉載
供稿:網友

概要

在將數據庫移動到新服務器后,用戶可能無法登錄到新服務器。相反,他們會收到下面的錯誤消息:

Msg 18456, Level 16, State 1

Login failed for user '%ls'.

您必須將登錄和密碼傳輸到新服務器。本文介紹如何將登錄和密碼傳輸到新服務器。

如何在運行 SQL Server 7.0 的服務器之間傳輸登錄和密碼

SQL Server 7.0 數據轉換服務 (DTS) 對象傳輸功能可在兩臺服務器之間傳輸登錄和用戶,但它不傳輸 SQL Server 驗證登錄的密碼。要將登錄和密碼從一臺運行 SQL Server 7.0 的服務器傳輸到另一臺運行 SQL Server 7.0 的服務器,請執行“在不同版本的 SQL Server 之間傳輸登錄和密碼的完整解決方案”一節中的步驟。

如何從 SQL Server 7.0 向 SQL Server 2000 或者在運行 SQL Server 2000 的服務器之間傳輸登錄和密碼

要從 SQL Server 7.0 服務器向 SQL Server 2000 的一個實例或者在 SQL Server 2000 的兩個實例之間傳輸登錄和密碼,可以使用 SQL Server 2000 中新的 DTS 包傳輸登錄任務。為此,請按照下列步驟操作:1. 連接到 SQL Server 2000 目標服務器,移動到 SQL Server 企業管理器中的數據轉換服務,展開此文件夾,右鍵單擊“本地包”,然后單擊“新增包”。

1、在 DTS 程序包設計器打開后,單擊“任務”菜單上的“傳輸登錄任務”。根據需要完成有關“源”、“目標”和“登錄”選項卡的信息。

重要說明:SQL Server 2000 目標服務器不能運行 64 位版本的 SQL Server 2000。64 位版本 SQL Server 2000 的 DTS 組件不可用。如果要從其他計算機上的 SQL Server 實例中導入登錄,您的 SQL Server 實例必須在域帳戶下運行才能完成此任務。

注意:DTS 方法將傳輸密碼,但不會傳輸原始 SID。如果登錄不是使用原始 SID 創建的,而且用戶數據庫也被傳輸到一臺新服務器,則該數據庫用戶將從該登錄中孤立出去。要傳輸原始 SID 并繞過被孤立的用戶,請執行“在不同版本的 SQL Server 之間傳輸登錄和密碼的完整解決方案”一節中的步驟。

在不同版本的 SQL Server 之間傳輸登錄和密碼的完整解決方案

此方法適用于以下情況:

• 從 SQL Server 7.0 向 SQL Server 7.0 傳輸登錄和密碼。

• 從 SQL Server 7.0 向 SQL Server 2000 傳輸登錄和密碼。

• 從 SQL Server 7.0 向 SQL Server 2005 傳輸登錄和密碼。

• 在運行 SQL Server 2000 的服務器之間傳輸登錄和密碼。

• 從 SQL Server 2000 向 SQL Server 2005 傳輸登錄和密碼。

注意:請查看本文末尾的備注,以了解有關下列步驟的重要信息。

要在不同版本的 SQL Server 之間傳輸登錄和密碼,請按下列步驟操作:1. 在源 SQL Server 上運行以下腳本。此腳本可在 master 數據庫中創建名為 sp_hexadecimal 和 sp_help_revlogin 的兩個存儲過程。請在完成過程的創建之后繼續執行第 2 步。

注意:下面的過程取決于 SQL Server 系統表。這些表的結構在 SQL Server 的不同版本之間可能會有變化,請不要直接從系統表中選擇。

----- Begin Script, Create sp_help_revlogin procedure -----
USE master
GO
IF OBJECT_ID ('sp_hexadecimal') IS NOT NULL
DROP PROCEDURE sp_hexadecimal
GO
CREATE PROCEDURE sp_hexadecimal
@binvalue varbinary(256),
@hexvalue varchar(256) OUTPUT
AS
DECLARE @charvalue varchar(256)
DECLARE @i int
DECLARE @length int
DECLARE @hexstring char(16)
SELECT @charvalue = '0x'
SELECT @i = 1
SELECT @length = DATALENGTH (@binvalue)
SELECT @hexstring = '0123456789ABCDEF'
WHILE (@i <= @length)
BEGIN
DECLARE @tempint int
DECLARE @firstint int
DECLARE @secondint int
SELECT @tempint = CONVERT(int, SUBSTRING(@binvalue,@i,1))
SELECT @firstint = FLOOR(@tempint/16)
SELECT @secondint = @tempint - (@firstint*16)
SELECT @charvalue = @charvalue
SUBSTRING(@hexstring, @firstint 1, 1)
SUBSTRING(@hexstring, @secondint 1, 1)
SELECT @i = @i 1
END
SELECT @hexvalue = @charvalue
GO
IF OBJECT_ID ('sp_help_revlogin') IS NOT NULL
DROP PROCEDURE sp_help_revlogin
GO
CREATE PROCEDURE sp_help_revlogin @login_name sysname = NULL AS
DECLARE @name sysname
DECLARE @xstatus int
DECLARE @binpwd varbinary (256)
DECLARE @txtpwd sysname
DECLARE @tmpstr varchar (256)
DECLARE @SID_varbinary varbinary(85)
DECLARE @SID_string varchar(256)
IF (@login_name IS NULL)
DECLARE login_curs CURSOR FOR
SELECT sid, name, xstatus, password FROM master..sysxlogins
WHERE srvid IS NULL AND name <> 'sa'
ELSE
DECLARE login_curs CURSOR FOR
SELECT sid, name, xstatus, password FROM master..sysxlogins
WHERE srvid IS NULL AND name = @login_name
OPEN login_curs
FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @xstatus, @binpwd
IF (@@fetch_status = -1)
BEGIN
PRINT 'No login(s) found.'
CLOSE login_curs
DEALLOCATE login_curs
RETURN -1
END
SET @tmpstr = '/* sp_help_revlogin script '
PRINT @tmpstr
SET @tmpstr = '** Generated '
CONVERT (varchar, GETDATE()) ' on ' @@SERVERNAME ' */'
PRINT @tmpstr
PRINT '
PRINT 'DECLARE @pwd sysname'
WHILE (@@fetch_status <> -1)
BEGIN
IF (@@fetch_status <> -2)
BEGIN
PRINT '
SET @tmpstr = '-- Login: ' @name
PRINT @tmpstr
IF (@xstatus & 4) = 4
BEGIN -- NT authenticated account/group
IF (@xstatus & 1) = 1
BEGIN -- NT login is denied access
SET @tmpstr = 'EXEC master..sp_denylogin '' @name ''
PRINT @tmpstr
END
ELSE BEGIN -- NT login has access
SET @tmpstr = 'EXEC master..sp_grantlogin '' @name ''
PRINT @tmpstr
END
END
ELSE BEGIN -- SQL Server authentication
IF (@binpwd IS NOT NULL)
BEGIN -- Non-null password
EXEC sp_hexadecimal @binpwd, @txtpwd OUT
IF (@xstatus & 2048) = 2048
SET @tmpstr = 'SET @pwd = CONVERT (varchar(256), ' @txtpwd ')'
ELSE
SET @tmpstr = 'SET @pwd = CONVERT (varbinary(256), ' @txtpwd ')'
PRINT @tmpstr
EXEC sp_hexadecimal @SID_varbinary,@SID_string OUT
SET @tmpstr = 'EXEC master..sp_addlogin '' @name
'', @pwd, @sid = ' @SID_string ', @encryptopt = '
END
ELSE BEGIN
-- Null password
EXEC sp_hexadecimal @SID_varbinary,@SID_string OUT
SET @tmpstr = 'EXEC master..sp_addlogin '' @name
'', NULL, @sid = ' @SID_string ', @encryptopt = '
END
IF (@xstatus & 2048) = 2048
-- login upgraded from 6.5
SET @tmpstr = @tmpstr ''skip_encryption_old''
ELSE
SET @tmpstr = @tmpstr ''skip_encryption''
PRINT @tmpstr
END
END
FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @xstatus, @binpwd
END
CLOSE login_curs
DEALLOCATE login_curs
RETURN 0
GO
----- End Script -----

2、在創建 sp_help_revlogin 存儲過程后,請從源服務器上的查詢分析器中運行 sp_help_revlogin 過程。sp_help_revlogin 存儲過程可同時用于 SQL Server 7.0 和 SQL Server 2000。sp_help_revlogin 存儲過程的輸出是登錄腳本,該腳本可創建帶有原始 SID 和密碼的登錄。保存輸出,然后將其粘貼到目標 SQL Server 上的查詢分析器中,并運行它。例如:EXEC master..sp_help_revlogin

備注

• 在目標 SQL Server 上運行輸出腳本之前,請認真查看此腳本。如果必須將登錄傳輸到與 SQL Server 源實例不在同一個域中的 SQL Server 實例,請編輯由 sp_help_revlogin 過程生成的腳本,并在 sp_grantlogin 語句中將域名替換為新的域名。由于在新域中被授予訪問權的集成登錄與原始域中的登錄具有不同的 SID,因此數據庫用戶將從這些登錄中孤立出去。要解決這些孤立用戶,請查看以下項目符號項中引用的文章。如果在同一個域中的 SQL Server 實例之間傳輸集成登錄,則會使用相同的 SID,而且用戶不太可能被孤立。

• 在移動登錄之后,用戶將不再具有訪問已被同時移動的數據庫的權限。此問題稱為“孤立用戶”。如果嘗試將訪問此數據庫的權限授予該登錄,則可能會失敗,這表明該用戶已存在:

Microsoft SQL-DMO (ODBC SQLState:42000) Error 15023:User or role '%s' already exists in the current database.

有關如何將登錄映射到數據庫用戶以解決孤立的 SQL Server 登錄和集成登錄的說明,請查看相關文章:

(http://support.microsoft.com/kb/240872/) 如何解決在運行 SQL Server 的服務器之間移動數據庫時的權限問題。

有關使用 sp_change_users_login 存儲過程逐個解決孤立用戶(僅能解決從標準 SQL 登錄中孤立出去的用戶)的說明,請查看相關文章:

(http://support.microsoft.com/kb/274188/) PRB:聯機叢書中的“孤立用戶疑難解答”主題不完整。

• 如果傳輸登錄和密碼是向運行 SQL Server 的新服務器移動數據庫的一部分,請查看相關文章,以了解對所涉及的工作流程和步驟的說明:

(http://support.microsoft.com/kb/314546/) 如何在運行 SQL Server 的計算機之間移動數據庫。

• 能夠這樣做的原因在于:sp_addlogin 系統存儲過程中的 @encryptopt 參數允許通過使用加密密碼來創建登錄。有關此過程的更多信息,請參見 SQL Server 聯機叢書中的“sp_addlogin (T-SQL)”主題。

• 默認情況下,只有 sysadminfixed 服務器角色的成員可以從 sysxlogins 表中進行選擇。除非 sysadmin 角色的成員授予了必要的權限,否則最終用戶將無法創建或運行這些存儲過程。

• 此方法不會嘗試傳輸特定登錄的默認數據庫信息,因為默認數據庫并不始終存在于目標服務器中。要為某個登錄定義默認數據庫,您可以使用 sp_defaultdb 系統存儲過程,方法是將登錄名和默認數據庫作為參數傳遞給該過程。有關使用此過程的更多信息,請參見 SQL Server 聯機叢書中的“sp_defaultdb”主題。

• 在 SQL Server 實例之間傳輸登錄的過程中,如果源服務器的排序順序不區分大小寫,而目標服務器的排序順序區分大小寫,則在將登錄傳輸到目標服務器后,必須以大寫形式輸入密碼中的所有字母字符。如果源服務器的排序順序區分大小寫,而目標服務器的排序順序不區分大小寫,則無法通過本文所述的步驟使用已傳輸的登錄進行登錄,除非原始密碼不包括字母字符或原始密碼中的所有字母字符都是大寫字符。如果兩個服務器都區分大小寫或者都不區分大小寫,則不會出現此問題。這是 SQL Server 處理密碼的方式所帶來的副作用。有關更多信息,請參見 SQL Server 7.0 聯機叢書中的“Effect on Passwords of Changing Sort Orders”(更改排序順序對密碼的影響)主題。

• 在目標服務器上運行“sp_help_revlogin”腳本的輸出時,如果該目標服務器已經定義了一個登錄,且該登錄名與腳本輸出中的某個登錄名相同,則在執行“sp_help_revlogin”腳本的輸出時,可能會看到下面的錯誤:

Server:Msg 15025, Level 16, State 1, Procedure sp_addlogin, Line 56

The login 'test1' already exists.

同樣,如果此服務器上存在其他登錄,且其 SID 值與您要嘗試添加的登錄的 SID 值相同,則會收到以下錯誤消息:

Server:Msg 15433, Level 16, State 1, Procedure sp_addlogin, Line 93

Supplied parameter @sid is in use.

因此,您必須仔細復查這些命令的輸出,檢查 sysxlogins 表的內容,并相應地解決這些錯誤。

• 特定登錄的 SID 值用作在 SQL Server 中實現數據庫級別訪問的基礎。因此,如果同一登錄在該數據庫級別(在該服務器上的兩個不同數據庫中)有兩個不同的 SID 值,則此登錄將僅能訪問其 SID 與該登錄的 syslogins 中的值相匹配的數據庫。如果所討論的兩個數據庫已從兩個不同的服務器合并在一起,則可能出現這種情形。要解決此問題,必須使用 sp_dropuser 存儲過程從具有不匹配 SID 的數據庫中手動刪除所討論的登錄,然后再使用 sp_adduser 存儲過程添加它。

這篇文章中的信息適用于:

• Microsoft SQL Server 7.0 標準版

• Microsoft SQL Server 2000 Personal Edition Service Pack 3

• Microsoft SQL Server 2000 標準版

• Microsoft SQL Server 2000 Workgroup Edition

• Microsoft SQL Server 2000 Developer Edition

• Microsoft SQL Server 2000 Enterprise Edition

• Microsoft SQL Server 2005 Standard Edition

• Microsoft SQL 2005 Server Workgroup

• Microsoft SQL Server 2005 Developer Edition

• Microsoft SQL 2005 Server Enterprise

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 乌鲁木齐县| 湛江市| 昭平县| 武隆县| 深州市| 天长市| 岢岚县| 阜宁县| 延边| 孙吴县| 大丰市| 峨边| 沙坪坝区| 临漳县| 清水河县| 玉树县| 杂多县| 林芝县| 海南省| 平塘县| 邵东县| 开化县| 大埔区| 沙田区| 达拉特旗| 乌什县| 航空| 福海县| 扎囊县| 安达市| 阳高县| 沙河市| 建始县| 全州县| 清镇市| 南康市| 福泉市| 香格里拉县| 庄浪县| 德保县| 寻甸|