サーバー全体で無効になっている Azure SQL ユーザーは引き続きログインできます

概要

特定の SQL ログインへのアクセスを完全にブロックしたいのですが、接続プロパティでデータベースが指定されている場合、サーバーは引き続き資格情報を受け入れます。

使用されたスクリプトは次のとおりです。

-- Master

CREATE LOGIN pmp
    WITH PASSWORD = 'xxx'
GO

-- User database

CREATE USER pmp
    FOR LOGIN pmp
    WITH DEFAULT_SCHEMA = dbo
GO

EXEC sp_addrolemember N'db_owner', N'pmp'
GO

-- Master

ALTER LOGIN pmp DISABLE
GO

オブジェクトエクスプローラー

解決策

この状況は、サーバー ログインを作成してから包含データベース ユーザーを作成したが、データベース ユーザーがマスターのログインに接続されていない場合にのみ発生します。包含データベース ユーザーはサーバー レベルのログインに依存しません。 「FOR LOGIN」句を使用してユーザーを作成する必要があります。これにより、データベース レベルのユーザーがサーバー レベルのログインに接続されます。

サーバー上に作成されたデータベースで使用されるサーバー ログインを作成するための正しい構文は次のとおりです。

-- On master database
CREATE LOGIN TestUser
    WITH PASSWORD = 'ThisIsAStrongPassword!' 
GO

CREATE USER TestUser
    FOR LOGIN TestUser
    WITH DEFAULT_SCHEMA = dbo
GO

-- create user on database level

CREATE USER TestUser
    FOR LOGIN TestUser
    WITH DEFAULT_SCHEMA = dbo
GO