回答:
ユーザーが無効になっているわけではなく(ログインのみ無効にできます)、ユーザーがデータベースに接続する権限を持っていないことを意味します。ユーザーがどのように作成されたか正確にはわかりませんが、これを示す最も簡単な方法は次のとおりです。
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];
その後、ユーザーはそれらのビューに表示され、オブジェクトエクスプローラーに赤いxが付いたユーザーとして表示されましたHAS_DBACCESS() = 0
。それでも、ほぼ同じことです:「データベースにアクセスできません」。したがって、上記GRANT CONNECT
が機能しない場合(私の場合は、赤いxを削除しましたが、実際にそのアカウントとしてデータベースを照会しようとしませんでした)、失敗する可能性があることを知って、次も試してください:
CREATE USER [DOMAIN\Group] FROM LOGIN [DOMAIN\Group];
私の場合、このユーザーへの接続を許可すると、CREATE USER
コマンドを実行できなくなりました。
メッセージ15023、レベル16、状態1、行16
ユーザー、グループ、またはロール 'CAKE \ MyGroup'は、現在のデータベースに既に存在します。
この状態は、特定のシステムデータベースのゲストアカウントを除き、guest
/ INFORMATION_SCHEMA
/ に対して常に真になりsys
ます。それを無視して、そのままにしておきます。
以下からのトピック:sp_addrolemember
以下からのトピック:sys.sysusers
私はこれを守るアーロン・バートランドの答えに追加したいだけです:
これは、ユーザーがデータベースへの接続特権を持っていないことを意味します(ユーザーを無効にすることはできず、ログインのみが可能です)。ユーザーがどのよう に作成されたのか正確にはわかりません ...
これは、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
そのため、画面上にはっきりと表示されていても、ユーザーはいないようです。
GRANT CONNECT
でも、私の最初の答えが示唆したように、問題を解決したはずです。
赤いXは、SQL Serverでログインが無効になっていることを意味します