21

最近、開発環境をSQL2000からSQL2008R2にアップグレードしました。本番データベースのバックアップを作成し、新しい開発サーバーに復元しました。

実稼働サーバーで使用するログインを反映するログインを開発サーバーに作成しましたが、データベースの「dbo」ユーザーにマップすることができません。「ユーザーマッピング」でログインのプロパティを編集すると、ユーザーが「dbo」に置き換えられ、次のエラーが発生します。

タイトル:ユーザー'dbo'のMicrosoftSQL ServerManagementStudioの作成に失敗しました。(Microsoft.SqlServer.Smo)Transact-SQLステートメントまたはバッチの実行中に例外が発生しました。(Microsoft.SqlServer.ConnectionInfo)ユーザー、グループ、またはロール'dbo'は現在のデータベースに既に存在します。(Microsoft SQL Server、エラー:15023)

では、ログインを既存のユーザーにマップするにはどうすればよいですか?

4

3 に答える 3

17

ユーザーとログインを照合するには、システムストアドプロシージャsp_change_users_loginを使用できます。

sp_change_users_login [ @Action = ] 'action'
[ , [ @UserNamePattern = ] 'user' ] 
[ , [ @LoginName = ] 'login' ] 
[ , [ @Password = ] 'password' ];

例えば:

EXEC sp_change_users_login 'Update_One','User123','User123'

同期していないユーザーが多数いる場合は、カーソルを使用してすべてのユーザーを引き出し、このコマンドを実行できます。同期していないユーザーに対してこれを実行しても悪影響はなく、孤立したすべてのユーザーが修正されます。

DECLARE @sql NVARCHAR(MAX);
DECLARE curSQL CURSOR
FOR
       SELECT   'EXEC sp_change_users_login ''UPDATE_ONE'', ''' + name + ''', ''' + name + ''''
       FROM     sysusers
       WHERE    issqluser = 1
                AND name NOT IN ( 'guest', 'dbo', 'sys', 'INFORMATION_SCHEMA' )
OPEN curSQL
FETCH curSQL INTO @sql
WHILE @@FETCH_STATUS = 0 
     BEGIN
           EXEC (
           @sql
           )
           FETCH curSQL INTO @sql
     END
CLOSE curSQL
DEALLOCATE curSQL

これは、ユーザーを修正する必要があるデータベースのコンテキストで実行する必要があります。

于 2013-05-10T01:56:55.893 に答える
16

この投稿に対するニコラ・マルコビノビッチのコメントを回答として追加する必要があると思います。ユーザーの変更コマンドを使用します。

USE {database}; 
ALTER USER {user} WITH login = {login}

どこ:

  • {データベース}:孤立したユーザーを含むデータベース
  • {user}:孤立したユーザー名
  • {login}:ログイン名。古いサーバーで使用されているものと同じログインを使用するか、ユーザーを別のログイン名にマップすることができます

この回答はhttp://www.aip.im/2010/05/re-map-database-user-to-login-in-sql-server-after-restoring-or-attaching-database/#sthashで見つかりました。 fbazv94Z.dpuf

于 2014-05-12T17:50:44.400 に答える
0

SQL Server 2012では、ユーザー「dbo」は変更できません。

于 2016-03-11T17:16:43.353 に答える