Quyền của người dùng bị rối sau khi sao lưu -> Khôi phục hoạt động


11

Tôi đã phải chuyển một số cơ sở dữ liệu SQL Server 2008 sang máy chủ db mới của chúng tôi để tôi sao lưu tất cả chúng (sang tệp .bak), sao chép các tệp này sang hộp mới và khôi phục chúng (tất cả được thực hiện bằng SQL Management Studio).

Tất cả đều ổn nhưng bây giờ tôi thấy tôi không thể đăng nhập vào bất kỳ cơ sở dữ liệu nào bằng tài khoản SQL Server vẫn tiếp tục hoạt động trên RDBMS cũ. Cửa sổ đăng nhập xác thực của tôi vẫn hoạt động tốt.

Tôi đã có ý tưởng này, tất cả người dùng và quyền sẽ được sao chép liền mạch trên máy chủ cơ sở dữ liệu mới nhưng có vẻ như đã xảy ra sự cố ở đâu đó. Tôi sẽ đánh giá cao ý kiến ​​/ đề nghị / đề nghị giúp đỡ ;-)

Câu trả lời:


7

Tôi thấy bạn đã tìm thấy giải pháp cho vấn đề của mình, một điều tôi nhận thấy trong câu hỏi ban đầu của bạn là bạn vẫn có quyền truy cập vào máy chủ cũ.

Câu hỏi sau đây về SO có vấn đề tương tự và bao gồm các liên kết đến bài viết của Microsoft có tập lệnh để tạo quyền người dùng.

/programming/461385/restoring-a-backup-to-a-different-server-user-permissions

(Tài nguyên được liệt kê cho câu hỏi đó http://support.microsoft.com/kb/918992 )

Nghe có vẻ như việc thay đổi cài đặt máy chủ từ xác thực Windows sang xác thực chế độ hỗn hợp đã khắc phục sự cố của bạn, nhưng chỉ trong trường hợp nó không giải quyết được hoàn toàn vấn đề tôi nghĩ điều này có thể hữu ích.


Tôi chắc chắn đây sẽ không phải là lần đầu tiên tôi đấu tranh với SQL Server về người dùng / quyền vì vậy tôi sẽ đánh dấu bài viết cho hậu thế. Rất cám ơn đã gửi bài.
5arx

6

Điều này được gọi là "người dùng mồ côi". Dưới đây là 2 cách khắc phục

  1. Nếu bạn có thể, hãy khôi phục cơ sở dữ liệu gốc là "loginsource" và sys.server_principals có đủ thông tin để tạo tất cả thông tin đăng nhập SQL Server và Windows. Đó là, SID và mật khẩu được mã hóa

  2. Nếu bạn chỉ sử dụng thông tin đăng nhập Windows, thì bạn có thể chạy cơ sở dữ liệu này trên mỗi cơ sở dữ liệu để tạo tập lệnh

Kịch bản:

SELECT
    'CREATE LOGIN [' + SUSER_SNAME(sid) + '] FROM WINDOWS'
FROM
    sys.database_principals
WHERE
    [type] IN ('G', 'U')

Cảm ơn phản hồi của bạn - ứng dụng web của tôi sử dụng thông tin đăng nhập SQL trong khi tài khoản windows của chúng tôi được sử dụng cho mục đích quản trị. Tôi không thể thấy cách khôi phục dưới dạng 'đăng nhập' như bạn đề xuất - bạn có thể giải thích rõ hơn không? Tôi hy vọng tất cả có thể được thực hiện bằng cách sử dụng Studio quản lý?
5arx

Tái bút Tôi đã theo tài liệu này: support.microsoft.com/kb/274188 và chạy tất cả các tập lệnh (dường như) thành công. Nhưng không có gì thay đổi.
5arx

5

Lý tưởng nhất là bạn sẽ loại bỏ người dùng và quyền trước khi thực hiện khôi phục. Nếu điều đó không xảy ra, thì bạn cần phải sửa chữa mọi thứ sau khi thực tế, và rất có thể sẽ có một cái gì đó bị bỏ qua nhưng bạn sẽ có thể đi được khoảng 90%.

Điều đầu tiên bạn cần xác định là nếu các thông tin đăng nhập tương tự tồn tại trên máy chủ mới. Nếu họ không thì bạn nên tìm hiểu xem liệu đăng nhập được tạo trên máy chủ mới có ổn không. Đừng bao giờ cho rằng chúng nên được tạo ra, có thể có một lý do chính đáng là tại sao chúng không tồn tại ở nơi đầu tiên. Sau đó, bạn có thể tạo ra chúng bằng cách đào qua bảng sysusers.

Bạn có thể sửa những người dùng mồ côi bằng cách chạy một cái gì đó tương tự như sau:

DECLARE @username varchar(25), @loginsid varbinary(85)
DECLARE fixusers CURSOR
FOR
SELECT UserName = name 
    FROM sysusers
    WHERE issqluser = 1 
    and (sid is not null and sid <> 0x0)
    and suser_sname(sid) is null
    and name in (select name from master..syslogins)
    ORDER BY name
OPEN fixusers
FETCH NEXT FROM fixusers
INTO @username
WHILE @@FETCH_STATUS = 0
BEGIN
    EXEC sp_change_users_login 'update_one', @username, @username

    FETCH NEXT FROM fixusers
    INTO @username
END CLOSE fixusers
DEALLOCATE fixusers 

Mã này sẽ hoạt động cho SQL2008, nhưng được viết để tương thích ngược với SQL2000.


Cảm ơn kịch bản. Tôi có thể cho rằng không có cách nào để làm điều này trong Management Studio không? Ngoài ra, một số người đề nghị tôi xóa và tạo lại người dùng ở cấp độ DB - điều này có được đề xuất không?
5arx

Điều này giả định rằng các thông tin đăng nhập đã tồn tại và chỉ làm hỏng SID
gbn

sp_change_usftimelog không cập nhật SID? msdn.microsoft.com/en-us/l Library / ms174378.aspx
SQLRockstar

5arx - không có cách nào để làm điều này trong SSMS. Như tôi đã nói, trong một tình huống lý tưởng, bạn sẽ viết kịch bản quyền của mình trước khi khôi phục. Tại thời điểm này, bạn cần phải tạo lại bằng tay hoặc cố gắng tự mình ghép các thứ lại với nhau. nếu tôi là bạn, tôi sẽ khôi phục db cũ, loại bỏ các quyền, thực hiện khôi phục từ máy chủ khác và sau đó làm lại quyền của bạn.
SQLRockstar

"Update_One: Liên kết người dùng được chỉ định trong cơ sở dữ liệu hiện tại với thông tin đăng nhập SQL Server hiện tại. Người dùng và đăng nhập phải được chỉ định. Mật khẩu phải là NULL hoặc không được chỉ định." Vì vậy, nó giả sử đăng nhập tồn tại.
gbn


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.