次のコマンドでデータベースにユーザーを作成します。
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.
テストユーザーをテストログインにリンクするにはどうすればよいですか。
このリンクの目的:サーバーから別のサーバーにデータベースを復元し、完全に復元した後、サーバー上の既存のログインでユーザーをマップします。
前もって感謝します。
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がそれらの権限を忘れてしまうため、最初に権限をスクリプト化してください。