すぐに判明したように、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、 name 、 type 、@ 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、 name 、 type 、@ 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.出来上がり! 喜ぶ。 =)
元の記事へのリンクはこちら 。