Pada contoh SQL Server 2014 dengan cukup RAM dan disk cepat, ada lebih dari 160 pengguna yang memiliki akses ke database. Untuk beberapa alasan tanpa sepengetahuan saya, menjalankan perintah DROP USER [username]
dalam database ini memakan waktu hingga 5 detik per pengguna.
Memetakan kembali pengguna untuk masuk dan mengembalikan izin mereka sangat cepat.
Dalam konteks menyegarkan basis data DEV dari produksi, saya harus menghapus dan membuat ulang semua pengguna basis data. Jadi ya menjatuhkan pengguna basis data dan membuat ulang mereka diperlukan.
Bagaimana cara mempercepat DROP USER
perintah?
Ingat, saya harus menjalankannya lebih dari 160 kali untuk contoh yang saya tulis.
Ini adalah SQL yang saya gunakan:
DECLARE drop_user_cur CURSOR FOR
SELECT name FROM #drop_users
OPEN drop_user_cur
FETCH NEXT FROM drop_user_cur INTO @user
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = 'use [' + @db_name + '] DROP USER [' + @user + ']'
BEGIN TRY
print @sql
EXECUTE(@sql)
END TRY
BEGIN CATCH
print 'ERREUR : ' + @sql
END CATCH
FETCH NEXT FROM drop_user_cur INTO @user
END
CLOSE drop_user_cur
DEALLOCATE drop_user_cur
Masalahnya bukan dari kursor; itu sebenarnya DROP USER
yang membutuhkan waktu hingga 5 detik.
Menggunakan sp_whoisactive
, wait_type adalah NULL
.
Jangan memperhatikan durasi, DROP
dan CREATE USER
sedang dijalankan dalam satu WHILE
lingkaran itulah sebabnya dikatakan lebih dari satu menit.
Profiler menunjukkan lebih dari 125.000 bacaan untuk dieksekusi DROP USER
.
Pialang Layanan tidak diaktifkan.
sumber
Jawaban:
Resolusi untuk masalah ini memungkinkan broker layanan pada database.
Setelah mengaktifkan broker layanan untuk database, pengguna drop praktis instan.
Kin bertanya apakah pialang layanan diaktifkan di komentar sebelumnya yang mengirim saya mencari ke arah yang benar.
sumber
ini bukan jawaban untuk pertanyaan tetapi argumen untuk menolaknya sama sekali.
Jika saya mengerti benar komentar Anda:
tujuan Anda adalah menyalin data produksi ke sistem dev dan membuatnya bekerja dengan izin yang sama dengan yang diproduksi, menggunakan nama pengguna yang sama .
Jalur tercepat adalah dengan mengklon login sql dari sistem produksi ke sistem dev menggunakan prosedur yang dijelaskan oleh ms dalam artikel kb ini .
dengan prosedur yang ditentukan oleh ms, hasilnya adalah Anda dapat mengembalikan basis data pada server dev Anda dan izin berfungsi tanpa perubahan.
Saya berhasil menggunakan prosedur yang disebutkan di atas untuk menyalin env produksi sql 2005 ke kedua lingkungan test & dev sql 2012.
Setelah mengkloning para pengguna, pemulihan database sederhana membawa saya ke sepasang sistem baru yang berfungsi penuh dengan data terbaru.
Kelebihan besar dari solusi itu adalah untuk menyegarkan data dev Anda baru saja mengembalikan database produksi dan hanya itu; Anda harus menyesuaikan referensi, sinonim dan semacamnya tetapi izin tidak akan rusak.
Berikut ini adalah kode dari artikel, hanya untuk referensi, tetapi silakan merujuk ke artikel yang memiliki komentar dan detail tentang kompatibilitas dengan versi sql kuno, detail enkripsi kata sandi, dan informasi lain yang dapat menyelamatkan Anda dari sakit kepala saat mentransfer login di server:
sumber
Kursor yang mirip dengan ini seharusnya berfungsi
sumber