Download meng-copy sql server login ke server lain

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project

Document related concepts
no text concepts found
Transcript
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-