web-dev-qa-db-ja.com

SQL Server修正ユーザー

次のコマンドでデータベースにユーザーを作成します。

CREATE USER Test WITHOUT LOGIN

テスト名でログインを作成しました。

テストユーザーをテストログインにリンクしたい。

次のコマンドを使用すると:

EXEC sp_change_users_login 'Update_One', 'Test', 'Test'

SQL Serverで以下のエラーが発生しました:

Msg 15291, Level 16, State 1, Procedure sp_change_users_login, Line 114
Terminating this procedure. The User name 'Test' is absent or invalid.

そして、私が次のコマンドを使用すると:

ALTER USER Test WITH LOGIN = Test

SQL Serverで発生するベローエラー:

Msg 33016, Level 16, State 1, Line 2
The user cannot be remapped to a login. Remapping can only be done for users that were mapped to Windows or SQL logins.

テストユーザーをテストログインにリンクするにはどうすればよいですか。

このリンクの目的:サーバーから別のサーバーにデータベースを復元し、完全に復元した後、サーバー上の既存のログインでユーザーをマップします。

前もって感謝します。

6
mehdi lotfi

WITHOUT LOGINで明示的に作成されたユーザーは、事後にログインにマップできません。

ログインで作成され、関連付けが失われたユーザー(例:データベースが別のサーバーに移動されたため、最初に新しいログイン(任意の名前)を作成し、次にALTER USER ... WITH LOGIN = ...コマンドを使用して再マップできます。

データベースtstを作成し、次にtstlogin内にログインtstuserおよび関連ユーザーtstを作成することを示すために、次のようにします。

CREATE DATABASE tst;
GO
CREATE LOGIN tstlogin WITH PASSWORD = 'passw8rd';
GO
USE tst;
GO
CREATE USER tstuser FOR LOGIN tstlogin;

正しい関連付けを表示するには、次のクエリを使用できます。

SELECT DP.sid,DP.name user_name, SP.name login_name
FROM sys.database_principals AS DP
LEFT JOIN sys.server_principals AS SP
ON DP.sid = SP.sid
WHERE DP.name = 'tstuser';

これは

SID                                        user_name      login_name
------------------------------------------ -------------- --------------
0xBF3D0CC874C72B469BEB4AA93845F59E         tstuser        tstlogin

ログインを削除しますtstlogin

DROP LOGIN tstlogin;

ユーザーを再確認します。

SELECT DP.sid,DP.name user_name, SP.name login_name
FROM sys.database_principals AS DP
LEFT JOIN sys.server_principals AS SP
ON DP.sid = SP.sid
WHERE DP.name = 'tstuser';

関連付けられたログインが表示されなくなりました:

SID                                        user_name      login_name
------------------------------------------ -------------- --------------
0xBF3D0CC874C72B469BEB4AA93845F59E         tstuser        NULL

次のステップは、新しいログインを作成することです。 (デモンストレーションの目的でdiffenertの名前を選択しましたが、同じ名前にすることもできます。)

CREATE LOGIN tstlogin2 WITH PASSWORD = 'passw8rd';

その新しいログインをユーザーに関連付けるには、ALTER USERステートメントを使用できます。

ALTER USER tstuser WITH LOGIN = tstlogin2;

関連付けをもう一度確認します。

SELECT DP.sid,DP.name user_name, SP.name login_name
FROM sys.database_principals AS DP
LEFT JOIN sys.server_principals AS SP
ON DP.sid = SP.sid
WHERE DP.name = 'tstuser';

ALTERステートメントが成功したことを示します:

SID                                        user_name      login_name
------------------------------------------ -------------- --------------
0xBF3D0CC874C72B469BEB4AA93845F59E         tstuser        tstlogin2

実際に「WITHOUT LOGIN」ユーザーを「with login」ユーザーに変更する必要がある場合は、そのユーザーを削除して再作成する必要があります。その場合は、ユーザーを削除するとSQL Serverがそれらの権限を忘れてしまうため、最初に権限をスクリプト化してください。

9
Sebastian Meine