これは、ユーザーが無効になっていることを意味するのではなく(loginsのみ無効にできます)、ユーザーがデータベースに接続する権限を持っていないことを意味します。ユーザーがどのように作成されたかは正確にはわかりませんが、これを実証する最も簡単な方法は次のとおりです。
_CREATE LOGIN u1 WITH PASSWORD = 'x', CHECK_POLICY = OFF;
GO
USE tempdb;
GO
CREATE USER u1 FROM LOGIN u1;
GO
ALTER LOGIN u1 DISABLE;
GO
-- u1 has no red x even though the login has been disabled
CREATE USER u2 WITHOUT LOGIN;
GO
-- check Object Explorer, u2 has no red x
DENY CONNECT TO u2;
GO
-- check Object Explorer, u2 now has a red x!
CREATE USER u3 WITHOUT LOGIN;
GO
-- check Object Explorer, u3 has no red x
REVOKE CONNECT FROM u3;
GO
-- check Object Explorer, u3 now has a red x!
_
(まあ、キャッシュのため、GO
コマンドの間にオブジェクトエクスプローラーを更新する必要があるかもしれません。)
それを修正するには(実際にデータベースに接続できるようにしたい場合):
_GRANT CONNECT TO [DomainName\BI360Consultants];
GRANT CONNECT TO [DomainName\BI360Users];
_
確かに、データベースで実行するために必要な権限に応じて、より多くの権限を適用する必要があります。
MichaelKの回答 で説明されているように、実際にユーザーを追加せずにドメイングループをデータベースのロールに追加するなど、この状態に入る他のもっとあいまいな方法がある可能性があります。私は正直なところ、OPが行うこと、古い方法または正しい方法を実行しようとしたときに、ユーザーが存在しないとドメイングループをロールに追加できませんでした。
_-- the old way
EXEC sys.sp_addrolemember N'db_datareader', N'[CAKE\MyGroup]';
_
メッセージ15410、レベル11、状態1、プロシージャsp_addrolemember
ユーザーまたはロール '[CAKE\MyGroup]'はこのデータベースに存在しません。
_-- the right way
ALTER ROLE db_datareader ADD MEMBER [CAKE\MyGroup];
_
メッセージ15151、レベル16、状態1
プリンシパル 'CAKE\MyGroup'が存在しないか、権限がないため、追加できません。
もちろん、この結果により、sysusers
(非推奨。使用を中止)または_sys.database_principals
_にそのようなユーザーは見られませんでした。しかし、私がこれを行った場合( sepupicの回答 のおかげで):
_GRANT SELECT ON dbo.SomeTable TO [CAKE\MyGroup];
_
次に、ユーザーはこれらのビューに表示され、HAS_DBACCESS() = 0
が原因で、赤いxが付いたオブジェクトエクスプローラーにユーザーとして表示されました。それでも、ほぼ同じことになります。「データベースにアクセスできません」。したがって、上記の_GRANT CONNECT
_が機能しない場合(私の場合、赤いxは削除されましたが、実際にそのアカウントとしてデータベースにクエリを実行しようとしませんでした)、次のことも試してください。不合格:
_CREATE USER [DOMAIN\Group] FROM LOGIN [DOMAIN\Group];
_
私の場合、このユーザーに接続を許可すると、_CREATE USER
_コマンドを実行できなくなりました。
メッセージ15023、レベル16、状態1、行16
ユーザー、グループ、またはロール 'CAKE\MyGroup'は現在のデータベースに既に存在します。
この状態はguest
/_INFORMATION_SCHEMA
_/sys
の場合は常に当てはまります-特定のシステムデータベースのゲストアカウントは例外です。それを無視して放っておいてください。
私はこれを補うためにアーロン・バートランドの答えに追加したいだけです:
これは、ユーザーにデータベースへの接続権限がないことを意味します(ユーザーを無効にすることはできず、ログインのみを無効にできます)。 正確にはわかりませんユーザーが作成されました ...
これは、Windows
プリンシパルで次の方法でのみ発生する可能性があります。
Windows
ログインはサーバーレベルに存在しますが、問題のデータベースにマップされていません。誰かがgrant
/deny
データベースレベルでこのWindowsプリンシパルへのいくつかの権限を決定します。この場合、対応するユーザー/スキーマがデータベースに作成され、このgrant
/deny
を含む行がsys.database_permissions
に書き込まれます。新しく作成されたユーザーはまだconnect
権限を逃しているため、このデータベースへのアクセス権は付与されません。OEで赤い矢印が表示されます。
それがなぜ起こったのか私は理解したと思います。
シナリオ:
Domain\BI360UsersはADグループです
Domain\BI360Usersはサーバーへのログインとして追加されます(接続権限があります)
Domain\BI360Usersはデータベースのユーザーとして存在しません
私は次のことを行います:
USE TEMPDB
GO
EXEC sp_addrolemember N'db_datareader', N'Doamin\BI360users'
GO
正常に完了します。
更新:赤の「x」が表示されます。
ユーザーを作成した場合:
USE TempDB
GO
CREATE USER [Domain\BI360Users] FOR LOGIN [DOMAIN\BI360Users]
GO
そのため、スクリーンショーで上にはっきりと示されていても、ユーザーはいないようです。