Izin Pengguna yang Dihapus setelah Pencadangan -> Kembalikan Operasi

11

Saya harus memindahkan beberapa database SQL Server 2008 ke server db baru kami, jadi saya mencadangkan semuanya (ke file .bak), menyalin file-file ini ke kotak baru dan mengembalikannya (semua dilakukan dengan menggunakan SQL Management Studio).

Semua berjalan baik, tetapi sekarang saya merasa saya tidak bisa login ke salah satu database menggunakan akun SQL Server yang terus bekerja pada RDBMS lama. Login yang diautentikasi Windows saya masih berfungsi dengan baik secara tidak sengaja.

Saya memiliki ide ini, pengguna dan izin semuanya akan diduplikasi dengan mulus ke server database baru tetapi tampaknya ada sesuatu yang salah di suatu tempat. Saya akan sangat menghargai komentar / saran / tawaran bantuan ;-)

5arx
sumber

Jawaban:

7

Saya melihat Anda sudah menemukan solusi untuk masalah Anda, satu hal yang saya perhatikan dalam pertanyaan awal Anda adalah bahwa Anda masih memiliki akses ke server lama.

Pertanyaan berikut tentang SO memiliki masalah yang sama dan menyertakan tautan ke artikel Microsoft dengan skrip untuk menghasilkan izin pengguna.

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

(Sumberdaya tercantum untuk pertanyaan itu http://support.microsoft.com/kb/918992 )

Kedengarannya seperti mengubah pengaturan server dari otentikasi Windows ke otentikasi mode Campuran memperbaiki masalah Anda, tapi kalau-kalau itu tidak sepenuhnya menyelesaikan masalah saya pikir ini mungkin berguna.

Jeff
sumber
Saya yakin ini tidak akan menjadi pertama kalinya saya bergumul dengan SQL Server atas pengguna / izin jadi saya akan bookmark artikel untuk anak cucu. Banyak terima kasih telah memposting.
5arx
6

Ini dikenal sebagai "pengguna yatim piatu". Berikut adalah 2 cara untuk memperbaikinya

  1. Jika Anda bisa, pulihkan database master asli sebagai "loginsource" dan sys.server_principals memiliki info yang cukup untuk menghasilkan semua login SQL Server dan Windows. Yaitu, SID dan kata sandi terenkripsi

  2. Jika Anda menggunakan login Windows saja, maka Anda dapat menjalankan ini per database untuk menghasilkan skrip

Naskah:

SELECT
    'CREATE LOGIN [' + SUSER_SNAME(sid) + '] FROM WINDOWS'
FROM
    sys.database_principals
WHERE
    [type] IN ('G', 'U')
gbn
sumber
Terima kasih atas tanggapan Anda - aplikasi web saya menggunakan login SQL sementara akun windows kami digunakan untuk keperluan administrasi. Saya tidak dapat melihat cara untuk memulihkan sebagai 'sumber masuk log' seperti yang Anda sarankan - dapatkah Anda menjelaskan? Saya harap ini semua bisa dilakukan menggunakan Managment Studio?
5arx
PS. Saya mengikuti dokumen ini: support.microsoft.com/kb/274188 dan menjalankan semua skrip (tampaknya) dengan sukses. Tapi tidak ada yang berubah.
5arx
5

Idealnya Anda akan skrip pengguna dan izin sebelum melakukan pengembalian. Jika itu belum terjadi, maka Anda perlu memperbaiki hal-hal setelah fakta, dan kemungkinan ada sesuatu yang terlewatkan tetapi Anda harus bisa mendapatkan sekitar 90% dari perjalanan ke sana.

Hal pertama yang perlu Anda pastikan adalah apakah login yang sama ada di server baru. Jika tidak maka Anda harus mencari tahu apakah itu boleh untuk login yang akan dibuat di server baru. Jangan pernah berasumsi bahwa mereka harus diciptakan, mungkin ada alasan bagus mengapa mereka tidak ada sejak awal. Anda kemudian dapat membuat mereka dengan menggali melalui tabel sysusers.

Anda dapat memperbaiki pengguna yatim dengan menjalankan sesuatu yang mirip dengan yang berikut:

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 

Kode ini akan berfungsi untuk SQL2008, tetapi ditulis agar kompatibel dengan SQL2000.

SQLRockstar
sumber
Terima kasih untuk skripnya. Bisakah saya berasumsi tidak ada cara melakukan ini di Management Studio? Juga, beberapa orang menyarankan saya menghapus dan membuat ulang pengguna tingkat DB - apakah ini disarankan?
5arx
Ini mengasumsikan login sudah ada dan hanya mataches SID
gbn
tidakkah sp_change_users_login memperbarui SID? msdn.microsoft.com/en-us/library/ms174378.aspx
SQLRockstar
5arx - tidak ada cara untuk melakukan ini di SSMS. Seperti yang saya katakan, dalam situasi ideal Anda harus menuliskan izin Anda sebelum pemulihan. Pada titik ini Anda harus membuat ulang dengan tangan atau mencoba menyatukan semuanya secara manual. jika saya jadi Anda, saya akan mengembalikan db lama, skrip izin, lakukan pengembalian dari server lain, dan kemudian ulangi izin Anda.
SQLRockstar
"Update_One: Tautan pengguna yang ditentukan dalam database saat ini ke login SQL Server yang ada. Pengguna dan login harus ditentukan. Kata sandi harus NULL atau tidak ditentukan." Jadi diasumsikan login sudah ada.
gbn