Bu makalede, Microsoft SQL Server instanceları arasında Loginlerin kullanıcı adı ve bununla birlikte şifre, yetki ve rol bilgilerini olduğu gibi aktarmayı ele alacağız. Databaselerimizi başka sunucuya taşırken tanımlı Loginleri de işleyişin sorunsuz ilerlemesi adına olduğu gibi taşımalıyız çünkü bir veritabanını A sunucusundaki SQL Server instance ından B sunucusundaki bir SQL Server instance ına taşıdıktan sonra kullanıcılar oturum açamayıp “Oturum açma başarısız.” hatası alabilir. Bu sorunların önüne geçmek adına Login taşıma işlemini de gerçekleştirmemiz gerekir. Login Taşıma işlemini adım adım inceleyelim.
Login taşıma işlemi varolan Loginler için de mümkündür. Ancak yeni bir Login oluşturma işlemini de görmek adına öncelikle sıfırdan bir Login oluşturalım. Security sekmesinin altındaki Logins tabından New Login seçeneğine tıklıyoruz.
Karşımıza Login – New penceresi çıkmaktadır. Login Name’i TestLogin olarak belirleyip. SQL Server Authentication oluşturuyoruz.
Bu Loginimize sysadmin yetkisi de atıyoruz. Taşınma yapıldıktan sonra da bu yetkisi de dahil olması beklenmektedir. (sysadmin: Sistem Yöneticisi)
Sonra Master veritabanında New Query açtık. Bu sorguda aşağıdaki scripti çalıştırıyoruz.
USE master GO IF OBJECT_ID ('sp_hexadecimal') IS NOT NULL DROP PROCEDURE sp_hexadecimal GO CREATE PROCEDURE sp_hexadecimal @binvalue varbinary(256), @hexvalue varchar (514) OUTPUT AS DECLARE @charvalue varchar (514) DECLARE @i int DECLARE @length int DECLARE @hexstring char(16) SELECT @charvalue = '0x' SELECT @i = 1 SELECT @length = DATALENGTH (@binvalue) SELECT @hexstring = '0123456789ABCDEF' WHILE (@i <= @length) BEGIN DECLARE @tempint int DECLARE @firstint int DECLARE @secondint int SELECT @tempint = CONVERT(int, SUBSTRING(@binvalue,@i,1)) SELECT @firstint = FLOOR(@tempint/16) SELECT @secondint = @tempint - (@firstint*16) SELECT @charvalue = @charvalue + SUBSTRING(@hexstring, @firstint+1, 1) + SUBSTRING(@hexstring, @secondint+1, 1) SELECT @i = @i + 1 END SELECT @hexvalue = @charvalue GO IF OBJECT_ID ('sp_help_revlogin') IS NOT NULL DROP PROCEDURE sp_help_revlogin GO CREATE PROCEDURE sp_help_revlogin @login_name sysname = NULL AS DECLARE @name sysname DECLARE @type varchar (1) DECLARE @hasaccess int DECLARE @denylogin int DECLARE @is_disabled int DECLARE @PWD_varbinary varbinary (256) DECLARE @PWD_string varchar (514) DECLARE @SID_varbinary varbinary (85) DECLARE @SID_string varchar (514) DECLARE @tmpstr varchar (1024) DECLARE @is_policy_checked varchar (3) DECLARE @is_expiration_checked varchar (3) DECLARE @defaultdb sysname IF (@login_name IS NULL) DECLARE login_curs CURSOR FOR SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM sys.server_principals p LEFT JOIN sys.syslogins l ON ( l.name = p.name ) WHERE p.type IN ( 'S', 'G', 'U' ) AND p.name <> 'sa' ELSE DECLARE login_curs CURSOR FOR SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM sys.server_principals p LEFT JOIN sys.syslogins l ON ( l.name = p.name ) WHERE p.type IN ( 'S', 'G', 'U' ) AND p.name = @login_name OPEN login_curs FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin IF (@@fetch_status = -1) BEGIN PRINT 'No login(s) found.' CLOSE login_curs DEALLOCATE login_curs RETURN -1 END SET @tmpstr = '/* sp_help_revlogin script ' PRINT @tmpstr SET @tmpstr = '** Generated ' + CONVERT (varchar, GETDATE()) + ' on ' + @@SERVERNAME + ' */' PRINT @tmpstr PRINT '' WHILE (@@fetch_status <> -1) BEGIN IF (@@fetch_status <> -2) BEGIN PRINT '' SET @tmpstr = '-- Login: ' + @name PRINT @tmpstr IF (@type IN ( 'G', 'U')) BEGIN -- NT authenticated account/group SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' FROM WINDOWS WITH DEFAULT_DATABASE = [' + @defaultdb + ']' END ELSE BEGIN -- SQL Server authentication -- obtain password and sid SET @PWD_varbinary = CAST( LOGINPROPERTY( @name, 'PasswordHash' ) AS varbinary (256) ) EXEC sp_hexadecimal @PWD_varbinary, @PWD_string OUT EXEC sp_hexadecimal @SID_varbinary,@SID_string OUT -- obtain password policy state SELECT @is_policy_checked = CASE is_policy_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name SELECT @is_expiration_checked = CASE is_expiration_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' WITH PASSWORD = ' + @PWD_string + ' HASHED, SID = ' + @SID_string + ', DEFAULT_DATABASE = [' + @defaultdb + ']' IF ( @is_policy_checked IS NOT NULL ) BEGIN SET @tmpstr = @tmpstr + ', CHECK_POLICY = ' + @is_policy_checked END IF ( @is_expiration_checked IS NOT NULL ) BEGIN SET @tmpstr = @tmpstr + ', CHECK_EXPIRATION = ' + @is_expiration_checked END END IF (@denylogin = 1) BEGIN -- login is denied access SET @tmpstr = @tmpstr + '; DENY CONNECT SQL TO ' + QUOTENAME( @name ) END ELSE IF (@hasaccess = 0) BEGIN -- login exists but does not have access SET @tmpstr = @tmpstr + '; REVOKE CONNECT SQL TO ' + QUOTENAME( @name ) END IF (@is_disabled = 1) BEGIN -- login is disabled SET @tmpstr = @tmpstr + '; ALTER LOGIN ' + QUOTENAME( @name ) + ' DISABLE' END PRINT @tmpstr END FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin END CLOSE login_curs DEALLOCATE login_curs RETURN 0 GO
‘Command(s) completed successfully.’ mesajını alıyoruz. Bu komut dosyası ana veritabanında saklı yordamlarını oluşturur. Yordamlar, sp_hexadecimal ve sp_help_revlogin olarak adlandırılır.
Yeni bir Query açıp EXEC sp_help_revlogin komutunu Execute ediyoruz.
Sp_help_revlogin: Depolanan yordamı oluşturur çıktı komut dosyasını oturum açma komut dosyasıdır. Bu oturum açma komut dosyası, özgün güvenlik tanımlayıcısı (SID) ve özgün parolayı sahip oturumların oluşturur.
Resim-4
Resim-4′ de gösterilen mesaj kısmındaki çıktı komut dosyasında, taşımak istediğimiz Loginin bilgilerinin olduğu kısmı kopyalayıp, hedef sunucu üzerinde veritabanını taşıdığımız SQL Server instance ına bağlanarak, Logini taşımak istediğimiz alanda çalıştırdığımız da Login taşıma işlemini tamamlamış oluruz.
Bu konuyla ilgili sorularınızı alt kısımda bulunan yorumlar alanını kullanarak sorabilirsiniz.
Referanslar
TAGs:Login Tasima, Sql Server Login Tasima, Create Login