web-dev-qa-db-ja.com

1つのデータベースの1つのスキーマにのみアクセスできるログインとユーザーを作成する方法

私は以下を実行しました:

USE [MyDatabase];
GO
CREATE LOGIN [MyDomain\MyAccount] FROM WINDOWS WITH DEFAULT_DATABASE=[MyDatabase];
CREATE USER [MyDomain\MyAccount] FOR LOGIN [MyDomain\MyAccount];
GRANT EXECUTE   ON SCHEMA::[MySchema] TO [MyDomain\MyAccount];
GRANT SELECT    ON SCHEMA::[MySchema] TO [MyDomain\MyAccount];
GRANT INSERT    ON SCHEMA::[MySchema] TO [MyDomain\MyAccount];

(このログインでこのデータベースの他のスキーマにアクセスできないようにするため、私はロールを付与していません。)

SSMSをMyDomain\MyAccountとして実行します(別のユーザーとして実行します)。次に、このインスタンスに接続しようとします。しかし、私は得ています:

ユーザーのデフォルトデータベースを開けません。ログインに失敗しました。ユーザーのログインに失敗しました
'MyDomain\MyAccount'。 (Microsoft SQL Server、エラー:4064)

接続プロパティでデフォルトのデータベースをMyDatabaseに設定しても、同じ結果が得られます。

プロファイラートレースを実行すると、エラー18456状態38が表示されます。

ユーザー 'MyDomain\MyAccount'のログインに失敗しました。理由:明示的に指定されたデータベース 'MyDatabase'を開くことができませんでした。 [クライアント:MyIpAddress]

その後にエラー18456状態40が続きます。

ユーザー 'MyDomain\MyAccount'のログインに失敗しました。理由:ログインプロパティで指定されたデータベース 'MyDatabase'を開けませんでした。 [クライアント:MyIpAddress]

MyDatabaseはオンラインであり、別のログインで接続することに問題はありません。 MyDomain\MyAccountに追加で付与する必要がある権限は何ですか?他に何か足りないものはありますか?

5
Mark Freeman

接続許可がないと思います。いつもユーザーで作成されていると思っていましたが、追加されない場合もあるかもしれません。

実行してみてください

USE [MyDatabase];
GO
GRANT CONNECT TO [MyDomain\MyAccount];

[MyDomain\MyAccount]のデフォルトスキーマを変更してみることもできます

ALTER USER [MyDomain\MyAccount] WITH DEFAULT_SCHEMA = MySchema;

最後に、my sp_dbpermissions および sp_srvpermissions を使用して、ユーザーの権限を確認できます。

EXEC sp_srvpermissions 'MyDomain\MyAccount'; -- Return instance level permissions
EXEC sp_dbpermissions 'All','MyDomain\MyAccount'; -- Return DB level permissions for all databases
3
Kenneth Fisher