Oturum ve Parolaları SQL Server örnekleri arasında aktarma

Şunlar için geçerlidir: Microsoft SQL Server 2005 Standard EditionMicrosoft SQL Server 2005 Workgroup EditionMicrosoft SQL Server 2005 Developer Edition

GİRİŞ


Bu makalede, farklı Microsoft SQL Server örnekleri arasında oturum ve parolaları aktarma konusunda açıklanır.

Not: Örnekleri ile aynı sunucuda veya farklı sunucularda olabilir ve bunların sürümleri farklı olabilir.

Diğer sürümleri SQL Server örnekleri arasında oturum ve parolaları aktarma hakkında daha fazla bilgi için Microsoft Bilgi Bankası'ndaki makaleyi görüntülemek üzere aşağıdaki makale numarasını tıklatın:

246133 nasıl oturum ve Parolaları SQL Server'ın eski sürümlerini çalıştıran SQL Server örnekleri arasında aktarma

Daha fazla bilgi


Bu makalede, farklı sunucuları sunucu A ve Sunucu B altındadır.
 
Bir veritabanını A sunucusundaki bir SQL Server örneğinden B sunucusındaki bir SQL Server örneğine taşıdıktan sonra kullanıcılar B sunucusundaki veritabanına oturum açamayabilir. Ayrıca kullanıcılar aşağıdaki hata iletisini alabilir:
'MyUser' kullanıcısı için oturum açma başarısız. (Microsoft SQL Server, hata: 18456)
Bu sorun, oturum ve Parolaları SQL Server örneği sunucu üzerinde SQL Server örneği üzerinde sunucu b için aktarmaya değil nedeniyle oluşur

Oturumları aktarmak için aşağıdaki yöntemlerden durumunuza uygun olanını kullanın.

Yöntem 1: hedef SQL Server (Sunucu B) bilgisayarda parola sıfırlama

Bu sorunu gidermek, SQL Server bilgisayarda parola sıfırlama ve sonra oturum açma komut dosyası için.

Not: Parolayı sıfırlamak için parola karma algoritması kullanılır.

Yöntem 2: oturum ve parolaları hedef sunucu kaynak sunucu (Sunucu B) üzerinde oluşturulan komut dosyaları kullanarak (Sunucu A) Transfer

Komut dosyasında boş bir parolaya sahip bir oturum oluşturmak için şu adımları izleyin:
  1. Sunucu, SQL Server Management Studio'yu başlatın ve sonra veritabanını taşıdığınız SQL Server örneğine bağlanmak.
  2. Yeni bir sorgu Düzenleyicisi penceresini açın ve sonra aşağıdaki komut dosyasını çalıştırın.
    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


    Not: Bu komut dosyası ana veritabanında saklı yordamlarını oluşturur. Yordamlar, sp_hexadecimal ve sp_help_revloginolarak adlandırılır.
  3. Aynı veya yeni bir sorgu penceresinde aşağıdaki ifadeyi çalıştırın:
    EXEC sp_help_revlogin
    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.

Hedef sunucu (Sunucu B) temel adımları şunlardır:

  1. B sunucu üzerinde SQL Server Management Studio'yu başlatın ve sonra veritabanını taşıdığınız SQL Server örneğine bağlanmak.

    Önemli 2. adıma geçmeden önce aşağıdaki "Açıklamalar" bölümündeki bilgileri gözden geçirin.
  2. Yeni bir sorgu Düzenleyicisi penceresini açın ve sonra yukarıdaki yordamı 2 adımda oluşturulan çıktı komut dosyasını çalıştırın.

Açıklamalar

Örnek B: sunucuda çıktı komut dosyasını çalıştırmadan önce aşağıdaki bilgileri gözden geçirin.

  • Parola sağlaması aşağıdaki şekillerde:
    • VERSION_SHA1: Bu karma SHA1 algoritması kullanılarak oluşturulur ve SQL Server 2008 R2 ile SQL Server 2000'de kullanılır.
    • VERSION_SHA2: Bu karma SHA2'yi 512 algoritması kullanılarak oluşturulur ve SQL Server 2012 ve sonraki sürümlerinde kullanılır.
  • Çıktı komut dosyası dikkatle gözden geçirin. Sunucu A ve Sunucu B farklı etki alanlarında ise, çıktı komut dosyasını değiştirmeniz gerekir. Sonra yeni etki alanı adı oturum açma oluşturma deyimleri kullanarak özgün etki alanının adını değiştirmek zorunda. Yeni bir etki alanı içinde erişim izni verilen tümleşik oturum açmayı oturumu olarak aynı SID özgün etki alanında yok. Bu nedenle, kullanıcılar bu oturumu açma artık. Bu artık kullanıcıları çözümleme hakkında daha fazla bilgi için Microsoft Bilgi Bankası'ndaki makaleyi görüntülemek üzere aşağıdaki makale numarasını tıklatın:

    240872 SQL Server çalıştıran sunucular arasında veritabanı taşındığında, izin sorunlarını gidermek nasıl

    Sunucu A ve Sunucu B aynı etki alanında varsa, aynı SID kullanılır. Bu nedenle, kullanıcılar artık olası değildir.
  • Çıktı komut dosyasında şifrelenmiş parolayı kullanarak oturum açma oluşturulur. Bu oturum açma oluşturma deyiminde HASHED bağımsız değişkeni nedeniyle olur. Bu bağımsız değişken parola bağımsız değişkenini sonra girilen parola karma olduğunu belirtir.
  • Varsayılan olarak, yalnızca sysadmin sabit sunucu rolünün bir üyesi sys.server_principals görünümünden bir SELECT deyimi çalıştırabilirsiniz. Üye sysadmin sabit sunucu rolü sürece kullanıcılar oluşturmak veya çıktı komut dosyasını çalıştırmak kullanıcılarına gereken izinleri verir.
  • Bu makaledeki adımları belirli bir oturum açma için varsayılan veritabanı bilgi aktarılmaz. Bunun nedeni, varsayılan veritabanı sunucusu B'ye üzerinde her zaman olmayabilir Bir oturum açma için varsayılan veritabanını tanımlamak için ALTER LOGIN ifadesini oturum açma adını ve varsayılan veritabanını geçirerek bağımsız değişken olarak kullanın.
  • Kaynak ve hedef sunucular üzerinde sıralama düzenleri:
    • Büyük küçük harf duyarsız server A ve B büyük küçük harf duyarlı server: Sunucu A dizilişini duyarlı ve Sunucu B sıralama büyük küçük harf duyarlı olabilir. Bu durumda, kullanıcıların oturumları aktardıktan sonra büyük harflerle tüm parolalar ve parolaları örneğine B. sunucuda yazmalısınız
    • Büyük küçük harf duyarlı Sunucu A ve B: duyarlı sunucu Sunucu sıralama büyük küçük harf duyarlı ve Sunucu B sıralama büyük küçük harf duyarlı olabilir. Bu durumda, kullanıcılar oturum ve aşağıdaki koşullardan biri doğru değilse, Sunucu B üzerinde örneğe transfer parolalar kullanarak oturumu açamaz:
      • Özgün harf içeren.
      • Özgün parolaların tüm harfleri büyük harf var.
    • Büyük küçük harf duyarlı veya duyarsız her iki sunucuda: hem Sunucu A ve Sunucu B sıralama düzenini büyük küçük harf duyarlı veya sıralama düzenini hem Sunucu A ve Sunucu B büyük küçük harf duyarlı olabilir. Bu gibi durumlarda, kullanıcıların bir sorun yaşamazsınız.
  • Zaten var olan sunucuda B örneğinde oturum açma çıktı komut dosyasında bir ad ile aynı olan bir ad olabilir. Bu durumda, B: sunucuda örneğinde çıktı komut dosyası çalıştırdığınızda, aşağıdaki hata iletisini alıyorsunuz
    Msg 15025, düzey 16, State 1, satır 1
    Sunucu asıl 'MyLogin' zaten mevcut.
    Benzer şekilde, zaten var olan sunucuda B örneğinde oturum açma SID çıktı komut dosyasında aynı SID sahip olabilir. Bu durumda, B: sunucuda örneğinde çıktı komut dosyası çalıştırdığınızda, aşağıdaki hata iletisini alıyorsunuz
    Msg 15433, düzey 16, State 1, satır 1
    Sağlanan parametre SID kullanılır.
    Bu nedenle, aşağıdakileri yapmanız gerekir:
    1. Çıktı komut dosyası dikkatle gözden geçirin.
    2. B. sunucuda örneğinde sys.server_principals görünümünün içeriğini inceleyin
    3. Bu hata iletilerini uygun adres.

      SQL Server 2005'te, bir oturum açma SID'si, veritabanı düzeyinde erişim uygulamak için kullanılır. Bir oturum açma SID farklı farklı veritabanlarında bir sunucuda olabilir. Bu durumda, oturum açma SID sys.server_principals görünümünde eşleşen SID içeren bir veritabanını yalnızca erişebilir. İki veritabanının farklı sunuculardan birleştirilir Bu sorun oluşabilir. Bu sorunu gidermek için el ile oturum açma SID uyuşmazlık DROP USER deyimi kullanarak veritabanına kaldırın. Daha sonra oturum açma yeniden CREATE USER deyimi kullanarak ekleyin.
  • Yeni bir SQL Server 2012 oturum açma komut dosyası bir öncesi SQL Server 2000 oturumu kullanarak oluşturmaya çalıştığınızda, aşağıdaki hata iletisini alırsınız:

    Msg 15021, düzey 16, State 2, 1 satır
    Parola parametresi için belirtilen değer geçersiz. Geçerli parametre değeri belirtin.

    Not: Oturum açma oluşturmak ve ALTER LOGIN ifadeleri için sağlanan 16 baytlık parola karma nedeniyle SQL Server 2012'de bu hatayı alırsınız.

    SQL Server 2012 çalıştıran bir sunucuda bu sorunu gidermek için boş bir parolaya sahip bir oturum oluşturma. Bunu yapmak için aşağıdaki komut dosyasını çalıştırın:
    CREATE LOGIN [Test] WITH PASSWORD = '', SID = 0x90FD605DCEFAE14FAB4D5EB0BBA1AECC, DEFAULT_DATABASE = [master], CHECK_POLICY = ON, CHECK_EXPIRATION = OFF
    Boş bir parolaya sahip bir oturum açma oluşturduktan sonra kullanıcının sonraki oturum açma girişiminde parolayı değiştirebilirsiniz.

Yöntem 3: öncesi SQL Server 2000 parolayı kullanarak oturum açma

Not: Bu yöntemi, yalnızca SQL server desteklenen daha yeni bir sürümü SQL Server 2000 geçiş geçerlidir.

Bu durumda, oturum açma öncesi SQL Server 2000 kullanarak SQL Server çalıştıran sunucuya oturum açmak için kullanıcı isteyin.

Not: Öncesi SQL Server 2000 parolayı kullanarak kullanıcı oturum açarken parola karma otomatik olarak güncelleştirilir.

Başvurular


Artık kullanıcı sorunlarını giderme hakkında daha fazla bilgi için Orphaned Users ile ilgili sorunları giderme Microsoft Developer Network (MSDN) Web sitesine gidin.

Oturum açma oluşturma deyimi hakkında daha fazla bilgi için Oturum açma (Transact-SQL) oluşturma MSDN Web sitesine gidin.

ALTER LOGIN ifadesini hakkında daha fazla bilgi için ALTER LOGIN (Transact-SQL) MSDN Web sitesine gidin.