Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
www.tobuku.com MENG-COPY SQL SERVER LOGIN KE SERVER LAIN Tingkat: Maret 2011 Oleh : Feri Djuandi Platform √ Pemula Menengah Mahir : Ms SQL Server 2000, 2005, 2008 Jika Anda berencana memindahkan sebuah database ke server lain (baik untuk keperluan testing, mirroring, maupun pemindahan server/database production) maka hal yang harus dilakukan selain mem-backup/restore database adalah meng-copy login-login yang ada di server yang pertama. Walaupun sepertinya sederhana, namun ini adalah langkah penting yang harus dilakukan dengan hati-hati dan benar. Coba bayangkan hal-hal berikut ini. Jika yang dipindahkan adalah sebuah database production, sekalipun login-login itu bisa dibuat lagi pada server yang baru dengan nama yang persis sama tetapi bagaimana dengan passwordnya? Apakah semua user itu akan ditanyai password-nya satu-per-satu? Tentunya itu bukanlah sebuah tindakan yang etis. Pada perusahaan manapun pasti ada kebijakan IT yang menyebutkan password tidak boleh diberikan kepada siapapun, termasuk kepada staff IT atau administrator. Selain pekerjaan yang melelahkan, membuat login baru secara manual pada server baru juga akan mendatangkan masalah lain: login-login tersebut tidak akan dapat dipetakan dengan useruser dalam database yang bersangkutan secara benar (pada SQL Server login dan user adalah entitas yang berbeda). Berbeda dengan manusia yang mengidentifikasi sebuah login menggunakan namanya (misalnya: SA, test_user, Andi, Susi, dan sebagainya), maka SQL Server akan mengidentifikasi sebuah login dengan Security Identifier (SID) yang bertipe data varbinary(16). Contoh: Login ----sa test ... SID -----------------------------------------0x01 0x06789F58F13C9A4EA9FD7F0C779EE389 Sebuah SID adalah kode yang unik sehingga jika ada beberapa SQL Server dengan nama login yang persis sama sekalipun, SID-nya akan berbeda-beda (kecuali login standar seperti SA dan BUILTIN\Administrator). Sebuah user yang dibuat dalam sebuah database akan dipetakan dengan sebuah login SQL Server berdasarkan SID-nya, bukan nama login-nya. Untuk melihat login-login yang ada pada sebuah SQL Server, Anda dapat menjalankan perintah: USE master GO SELECT * FROM syslogins -1- www.tobuku.com Sedangkan untuk melihat user-user di dalam sebuah database, jalankan perintah: USE <nama_database> GO SELECT * FROM sysusers Untuk melihat relasi login dan user di dalam sebuah database, jalankan perintah berikut ini pada database yang bersangkutan. USE <nama_database> GO SELECT LEFT(the_user.name,30) AS 'user name', LEFT(the_login.name,30) AS 'login name', the_user.sid FROM sysusers the_user, master..syslogins the_login WHERE the_login.sid=the_user.sid Perhatikan relasinya berdasarkan SID Ingat bahwa table sysusers ada di dalam setiap database, jadi jika Anda mem-backup db-1 maka table tersebut (termasuk user-user di dalamnya) akan ikut ter-backup. Saat Anda me-restorenya pada server lain (misalnya sqlsvr-2) kemudian Anda membuat login baru pada sqlsvr-2 dengan nama user-1, pasangan login-user tersebut tidak akan direlasikan dengan benar karena SID-nya berbeda. Akibatnya pada sqlsvr-2, Anda tidak dapat mengakses database db-1 menggunakan login user-1. Hal ini adalah masalah yang sering terjadi bagi Anda yang berpengalaman memindahkan database dari satu server ke server lain. Sekarang Anda tahu penyebabnya, bukan? Cara yang umum dianjurkan oleh manual SQL Server untuk meng-copy login adalah dengan mem-backup database master dari server yang pertama dan me-restore-nya pada server yang kedua. Itu memang cara yang standar, namun membutuhkan beberapa langkah yang harus dilakukan dengan hati-hati oleh administrator yang berpengalaman. Sesungguhnya ada alternatif lain yang lebih sederhana. Pada artikel ini akan diperlihatkan sebuah tips untuk mengcopy login dari sebuah SQL Server ke SQL Server yang lain dengan aman, cepat dan mudah. Anda bahkan dapat meng-copy password dari semua login! Tergantung pada versi SQL Server yang digunakan, jalankan skrip SQL berikut ini pada server pertama. Sebelum menjalankan perintah tersebut, pastikan mode output-nya adalah text (bukan grid) karena kita akan menyimpan output tersebut ke dalam sebuah file text. Jika server pertama adalah SQL Server 2000: SELECT 'exec sp_addlogin ['+ [name]+'],', password, ',@sid =',sid, ',@encryptopt=skip_encryption' FROM master..sysxlogins WHERE [name] IS NOT NULL AND sid IS NOT NULL ORDER BY [name] -2- www.tobuku.com Jika server pertama adalah SQL Server 2005 atau 2008: SELECT 'exec sp_addlogin ['+ a.name+'],', b.password_hash, ',@sid =',a.sid, ',@encryptopt=skip_encryption' FROM master.Sys.Server_Principals a LEFT OUTER JOIN master.Sys.sql_logins b ON a.sid = b.sid WHERE a.name IS NOT NULL AND a.sid IS NOT NULL AND a.type IN ('S','U') ORDER BY a.name; Skrip SQL di atas akan menghasilkan perintah-perintah pembuatan semua login dari server yang pertama menggunakan stored procedure sp_addlogin. Stored procedure ini adalah perintah yang biasa dipakai untuk membuah sebuah login melalui window query (bukan menggunakan Wizard). Yang menarik disini, skrip tersebut akan sekaligus menambahkan SID dan password dalam bentuk hash (enkripsi) di dalam setiap perintah sp_addlogin. Cara ini akan memastikan login-login yang akan dibuat pada server ke-dua akan persis identik dengan yang ada di server pertama. Karena hasilnya berbentuk text, maka dianjurkan output tersebut disimpan dalam bentuk file SQL agar selanjutnya bisa di-copy ke server yang ke-dua dan dijalankan di sana. Perhatikan bahwa Anda mungkin tidak akan menjalankan semua baris perintah tersebut, melainkan beberapa baris tertentu untuk membuat login-login yang perlu saja. Tidak perlu kuatir jika sebuah login telah ada pada server ke-dua dan Anda tidak sengaja menambahkan lagi login yang sama. Operasi tersebut akan dibatalkan oleh SQL Server secara otomatis dan sebuah pesan kesalahan akan ditampilkan. Contoh: Server: Msg 15025, Level 16, State 1, Procedure sp_addlogin, Line 56 The login 'test' already exists. Setelah Anda berhasil meng-copy login ke dalam server ke-dua, selanjutnya Anda dapat merestore database-database dan menggunakannya tanpa masalah karena semua user telah dipetakan dengan benar. -3-