SQL Serverのインスタンス間でユーザーを移行する

私は、データベースサーバーをある鉄から別の鉄に移すという、その前にそのような仕事をしていました。 ためらうことなく、別のハードウェアにSQL Server 2005をインストールし、バックアップからデータベースを復元します。すべては問題ないと思います。 しかし、ここにはありませんでした...



すぐに判明したように、SQL Serverユーザーは新しいサーバーにログインできません。 アカウントは古いサーバーに残りました。



どうする? 実際、SQL Server 2005にはアカウントを移行するためのツールがなく、ありませんでした。また、一般的に、鉄から鉄への移行については何も提供されていません。



その結果、アクションのアルゴリズムを説明するマイクロソフトの記事に出会いました...





初期データ:サーバーAがあります-必要なログインが含まれ、サーバーBがあります-それらに転送(ログイン)する必要があります。



アクション:



1. SQL Server Managment Studioを使用してサーバーAに接続します



2.次のスクリプトを実行します。



使用マスター

行く

OBJECT_ID( 'sp_hexadecimal')がNULLでない場合

ドロップ手順sp_hexadecimal

行く

CREATE PROCEDURE sp_hexadecimal

@binvalue varbinary(256)、

@hexvalue varchar(514)出力

として

DECLARE @charvalue varchar(514)

DECLARE @i int

DECLARE length int

DECLARE @hexstring char(16)

SELECT @charvalue = '0x'

SELECT @i = 1

SELECTの長さ = DATALENGTH(@binvalue)

SELECT @hexstring = '0123456789ABCDEF'

WHILE(@i <= length

開始

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

終了



SELECT @hexvalue = @charvalue

行く

OBJECT_ID( 'sp_help_revlogin')がNULLでない場合

ドロップ手順sp_help_revlogin

行く

CREATE PROCEDURE sp_help_revlogin @login_name sysname = NULL AS

DECLARE name sysname

DECLARE タイプ 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'

その他

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

login_cursを開く



次からlogin_cursへのFETCH @ SID_varbinary、 nametype 、@ is_disabled、@ defaultdb、@ hasaccess、@ denylogin

IF(@@ fetch_status = -1)

開始

印刷 '名前が見つかりません。'

login_cursを閉じる

login_cursの割り当て解除

-1を返す

終了

SET @tmpstr = '/ * sp_help_revlogin script'

@tmpstrを印刷

SET @tmpstr = '** Generated' + CONVERT(varchar、GETDATE())+ 'on' + @@ SERVERNAME + '* /'

@tmpstrを印刷

印刷 ''

WHILE(@@ fetch_status <> -1)

開始

IF(@@ fetch_status <> -2)

開始

印刷 ''

SET @tmpstr = '-ログイン:' + 名前

@tmpstrを印刷

IF( タイプ IN( 'G'、 'U'))

BEGIN-NT認証済みアカウント/グループ



SET @tmpstr = 'CREATE LOGIN' + QUOTENAME( name )+ 'FROM WINDOWS WITH DEFAULT_DATABASE = [' + @defaultdb + ']'

終了

ELSE BEGIN-SQL Server認証

-パスワードと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

-パスワードポリシーの状態を取得する

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)

開始

SET @tmpstr = @tmpstr + '、CHECK_POLICY =' + @is_policy_checked

終了

IF(@is_expiration_checked IS NOT NULL)

開始

SET @tmpstr = @tmpstr + '、CHECK_EXPIRATION =' + @is_expiration_checked

終了

終了

IF(@denylogin = 1)

BEGIN-ログインは拒否されました

SET @tmpstr = @tmpstr + '; SQLへの接続の拒否 '+ QUOTENAME( name

終了

ELSE IF(@hasaccess = 0)

BEGIN-ログインは存在するが、アクセス権がない

SET @tmpstr = @tmpstr + '; CONNECT SQLを '+ QUOTENAME( name )に取り消します

終了

IF(@is_disabled = 1)

BEGIN-ログインは無効です

SET @tmpstr = @tmpstr + '; ALTER LOGIN '+ QUOTENAME( name )+' DISABLE '

終了

@tmpstrを印刷

終了



次からlogin_cursへのFETCH @ SID_varbinary、 nametype 、@ is_disabled、@ defaultdb、@ hasaccess、@ denylogin

終了

login_cursを閉じる

login_cursの割り当て解除

0を返す

行く



3.スクリプトは2つのプロシージャを作成します。 sp_help_revloginが必要です。 サーバーAでこの手順を実行します。



EXEC sp_help_revlogin



4.この手順により、ログインを別のサーバーに転送するために必要なスクリプトが作成されます。 のような文字列から



パスワードを使用してログインを作成[ログイン] = 0x0100F43F09430FB0C4B5F6F413D2042E0FF0189E7894ADC460FB HASHED、SID = 0x9EC29C663D65E340AFF53E4B8861684B、DEFAULT_DATABEC OFF = [master]



必要なものを選択してください。 そして、これらのスクリプトをサーバーBで実行します。



5.出来上がり! 喜ぶ。 =)



元の記事へのリンクはこちら



All Articles