Perbaiki untuk 'tamu' pengguna anak yatim?

8

Apa yang dapat dilakukan, jika ada, ketika guestpengguna khusus menjadi yatim (tidak tertaut ke info masuk mana pun)?

Untuk salah satu database saya (SQL Server 2005), mengeksekusi daftar berikut pengguna tamu sebagai pengguna yatim.

exec sp_change_users_login 'report'

Hasil:

UserName    UserSID
guest       0x3C2E66759FFBC14F84127D6795C27FD3

Jika saya mencoba memperbaiki pengguna tamu menggunakan prosedur itu, saya mendapatkan yang berikut:

exec sp_change_users_login 'update_one', 'guest', 'guest'

Mengakhiri prosedur ini. 'guest' adalah nilai terlarang untuk parameter nama login dalam prosedur ini.

Jika saya mencoba menghapus pengguna, saya mendapatkan:

Pengguna 'tamu' tidak dapat dijatuhkan, itu hanya dapat dinonaktifkan.

select * from sys.database_principals where name = 'guest'

Hasil dalam:

name                 guest
principal_id         2
type                 S
type_desc            SQL_USER
default_schema_name  guest
create_date          11/13/98 2:58 AM
modify_date          10/16/01 4:31 PM
owning_principal_id  NULL
sid                  0x3C2E66759FFBC14F84127D6795C27FD3
is_fixed_role        0

Basis data tampaknya bingung apakah ini pengguna khusus atau bukan. Adakah yang bisa dilakukan?

JustinStolle
sumber
SID-nya terdaftar sebagai 0x3C2E66759FFBC14F84127D6795C27FD3ganti0x00
JustinStolle
Sudahkah Anda mencoba melakukan perbaikan otomatis? Saya penasaran melihat hasilnya.
SQLRockstar
Saya mendapatkanTerminating this procedure. 'guest' is a forbidden value for the login name parameter in this procedure.
JustinStolle
Anda mendapatkan kesalahan itu karena Anda tidak dapat memiliki tamu sebagai nama pengguna ( msdn.microsoft.com/en-us/library/ms174378.aspx ). Saya kesulitan membuat ulang skenario Anda.
Thomas Stringer
1
Saya ingin menambahkan bahwa saya mengalami masalah yang sama persis dengan Justin. Masalahnya di sini adalah sisi tamu harus 0x00 tetapi untuk alasan apa pun, itu bukan dan karena itu 'laporan' sp_change_users_login akan mengambilnya sebagai pengguna yatim piatu. Saya tidak bisa melihat bahwa ada cara bagi DBA untuk mengubah atau mengacaukan [tamu] dengan cara biasa. Jadi saya pikir kekacauan ini sangat mungkin dibuat oleh patch server sql suatu saat, entah bagaimana.
jyao

Jawaban:

5

Pengguna "tamu" tidak pernah ditugaskan untuk login server, bahkan pada instalasi baru itu diklasifikasikan sebagai pengguna SQL tanpa login. Karena Anda hanya dapat mengatur SID dari login (saat pembuatan), dan bukan pengguna, saya tidak percaya bahwa ini mungkin; sp_change_users_login tidak berfungsi dengan tepat karena akun tamu tidak boleh dipetakan ke login server. Akibatnya, pengguna "tamu" selalu menjadi pengguna yatim. Mungkin bukan jawaban yang Anda inginkan :)

World Wide DBA
sumber
Apakah Anda pikir ada cara untuk membuat cadangan / memulihkan basis data ini ke lokasi lain sambil meninggalkan pengguna tamu dari pemulihan?
JustinStolle
Ya tapi tidak cantik. Pencadangan dan pemulihan sederhana tidak akan berfungsi karena pengguna tamu akan disertakan di dalamnya. Anda harus mulai dengan database baru yang dibuat menggunakan metode yang sama dengan yang Anda gunakan untuk menginstalnya semula (dengan asumsi tamu dalam model memiliki SID yang benar). Kemudian dari sistem yang ada, ekspor semua data ke dalam basis data baru Anda. Ini akan berhasil, tetapi banyak upaya untuk sesuatu yang sangat kecil ...
World Wide DBA
Jadi, meskipun akun memiliki SID yang tidak terduga, Anda pikir sebenarnya tidak ada masalah dengannya dan aman untuk mengabaikannya dalam sp_change_users_loginlaporan?
JustinStolle
Dalam contoh ini saya akan mengatakannya, berdasarkan fakta bahwa sebenarnya tidak banyak yang dapat Anda lakukan mengenai hal itu. Lalu ada debat klasik tentang apakah Anda sebaiknya / tidak seharusnya menggunakannya, tapi itu pertanyaan yang sama sekali berbeda ... :)
World Wide DBA
2

Pikiranku ... Alasannya sp_change_users_loginmelemparkan kesalahan itu adalah karena MS juga menulisnya. [Melihat-lihat kode prosedur sistem sesekali bisa menyenangkan. :)] Namun fakta bahwa itu muncul ketika menjalankan laporan menunjukkan bahwa seseorang / beberapa proses mengacaukan akun, atau kemungkinan perbaikan terbaru dari MS bisa melakukannya (Anda tidak pernah tahu).

Akun tamu seharusnya ada di sana, itu ada di setiap basis data yang dibuat karena akun ada dalam model secara default. Membuatnya tidak muncul dalam laporan mungkin akan memerlukan mendapatkan bahwa SID diubah kembali ke 0x00saya kira. Selama akun dinonaktifkan, saya akan membiarkannya dan mengabaikannya. Jika itu benar-benar mengganggu saya, saya akan mengeluarkan uang dan menelepon dengan dukungan Microsoft.


sumber
Dengan kata lain, Anda mengatakan itu bukan masalah yang guestmuncul dalam hasil dalam kasus ini.
JustinStolle
Cukup banyak, ya.
1

Catatan: Setiap kali Anda memindahkan database Anda dari satu server ke server lain ada masalah pengguna yatim biasanya terjadi. FileListOnly adalah istilah baru dalam sql server yang memiliki semua detail cadangan yang dibuat yang memiliki akses ke sana.

Jadi ada urutan tugas yang harus Anda ikuti

  1. Pertama, Anda harus mengembalikan FileListOnly dari cadangan yang dibuat ke tujuan atau server baru.
  2. Kembalikan cadangan.
  3. Gunakan sp_change_users_login sesuai kebutuhan. Untuk bantuan mengenai prosedur ini, Anda dapat merujuk http://msdn.microsoft.com/en-us/library/ms174378.aspx .

Saya memberi contoh di sini berharap ini akan membantu:

> RESTORE FILELISTONLY FROM DISK = N'C:\YourDB.bak'
> 
> RESTORE DATABASE YourDb FROM DISK = N'C:\YourDB.bak' WITH MOVE
> N'YourDB' TO N'D:\YourDB.mdf', MOVE N'YourDB_log' TO N'D:\YourDB.ldf',
> REPLACE
> 
> exec YourDB.dbo.sp_change_users_login 'update_one', 'UserName','UserName'
JP Chauhan
sumber
Ini tidak akan berfungsi untuk guestpengguna. Lihat jawaban di atas oleh Mr.Brownstone.
Simon Righarts