2010-10-18 34 views
7

Tôi đang cố khôi phục cơ sở dữ liệu (SQL SERVER 2008) từ bản sao lưu trong một máy chủ khác. Vấn đề tôi có là với thông tin đăng nhập, vì người dùng được bao gồm trong bản sao lưu nhưng đăng nhập thì không.khôi phục lỗi đăng nhập cơ sở dữ liệu người dùng

Vì vậy, tôi cố tạo một thông tin đăng nhập mới trong máy chủ nhưng có vẻ như nó không hoạt động.

có ai biết giải pháp này không?

Trả lời

2

Nó sẽ hữu ích nếu bạn đăng thông báo lỗi thực tế và các bước được thực hiện để tạo lỗi.

Dù sao, tôi nghĩ những gì bạn cần làm là xóa người dùng khỏi cơ sở dữ liệu đã khôi phục. Sau đó, bạn sẽ có thể thiết lập người dùng & đăng nhập Máy chủ tương ứng từ đầu.

EDIT:

Nếu người dùng sở hữu một lược đồ trong cơ sở dữ liệu, bạn sẽ không thể xóa người dùng. There is Microsoft article on how to transfer SQL Logins.

+0

ok, tôi đã quản lý để xóa người dùng bằng cách thay đổi giản đồ. Vì vậy, tôi đã thêm một đăng nhập và người dùng mới nhưng tôi vẫn nhận được cùng một lỗi: Chi tiết ngoại lệ: System.Data.SqlClient.SqlException: Đăng nhập thất bại cho người dùng 'xx'. – user441365

+0

Tôi đã kiểm tra trên trình xem sự kiện và eventid lỗi: 1309 – user441365

+0

@ user441365 - Kiểm tra liên kết này tại đây để biết thêm chi tiết về lỗi này. Tiểu bang là gì? http://msdn.microsoft.com/en-us/library/ms366351.aspx – codingbadger

14

Đó là vấn đề rất phổ biến sau khi khôi phục. Một người dùng (cơ sở dữ liệu cụ thể) và một đăng nhập (toàn bộ máy chủ) đều có một SID. Vấn đề có thể là thông tin đăng nhập bạn đã tạo có SID khác với thông tin đăng nhập trên cơ sở dữ liệu sản xuất. Bạn có thể kiểm tra tên đăng nhập và sử dụng SID như:

select UserSid from sysusers where name = 'UserName' 
select LoginSid from master.dbo.syslogins where name = 'UserName' 

Dưới đây là một kịch bản chúng tôi chạy sau mỗi lần sao lưu để sửa chữa các đăng nhập - liên kết cơ sở dữ liệu:

declare user_cursor cursor forward_only read_only for 
    SELECT distinct u.name 
    FROM sysusers u 
    JOIN master.dbo.syslogins l ON u.name = l.name 
    WHERE u.issqluser <> 0 
declare @user sysname; 

open user_cursor 
fetch next from user_cursor into @user; 

while @@fetch_status = 0 
    begin 
    if @user <> 'dbo' 
     begin 
     print '' 
     print 'Updating user "' + @user + '"' 
     exec sp_change_users_login 'Auto_Fix', @user 
     end 
    fetch next from user_cursor into @user 
    end; 

close user_cursor 
deallocate user_cursor 
+0

Làm việc như một say mê, cảm ơn! Kịch bản này giúp tôi tiết kiệm thời gian lãng phí ... – DaveN59

13

Im không chắc chắn 100% về nguyên nhân của bạn lỗi nhưng kịch bản này sẽ giúp tôi khi khôi phục cơ sở dữ liệu từ máy chủ khác, giả sử tên đăng nhập và sử dụng đã tồn tại trong máy chủ mục tiêu:

EXEC sp_change_users_login UPDATE_ONE, '[username]', '[loginname]' 

(thay thế [username] với cơ sở dữ liệu của bạn tên người dùng [loginname] với thông tin đăng nhập máy chủ)

-1

Tôi không thể nhận xét về bài đăng ở trên - nhưng nó hoạt động, chỉ amiăng tôi phải thực hiện là LINE 4 nơi tôi đã chỉ định đối chiếu mặc định trên trường.

JOIN master.dbo.syslogins l ON u.name COLLATE DATABASE_DEFAULT = l.name COLLATE DATABASE_DEFAULT 
Các vấn đề liên quan