我已经专门禁用了数据库服务器上的登录。这是 Azure 托管的 SQL 即服务数据库。
alter login [********@hotmail.com] disable
这是服务器上登录的样子。正如您所看到的,图标上的红色 X 表示它实际上已被禁用。
然而,我可以登录服务器并访问为其定义该用户的数据库。这怎么可能?如果禁用数据库服务器上的登录并不能阻止该帐户登录数据库服务器,那么禁用该帐户又意味着什么呢?
我已经使用来自两个不同身份验证域的两个不同帐户测试了此行为。他们都表现出相同的行为。
我想要做的是在数据库中定义用户,以便该用户可以访问只读副本服务器上的数据库,但从主服务器禁用(或以其他方式删除)相应的登录名,以便该用户不会被能够访问主服务器上的主数据库。但是我发现,将 Microsoft Entra (Azure AD) 帐户定义为特定数据库上的用户后,如果服务器上定义了相应的登录名,或者服务器上没有定义登录名,则绝对没有区别,或者如果服务器上定义了登录名,但它被明确禁用。这是处理外部用户帐户登录方式的错误吗?我对登录/用户关系的理解是,首先需要在服务器上有良好信誉的登录,这是登录数据库服务器时检查的第一件事。这不正确吗?
新的信息:
即使对于 SQL Server 用户,我也看到了这种行为。我可以简单地在数据库中创建一个 SQL Server 用户,然后登录来访问该数据库,而无需创建服务器登录名。这种行为正是我们对包含数据库的期望。(https://learn.microsoft.com/en-us/sql/relational-databases/databases/contained-databases?view=sql-server-ver16)但数据库未包含!
因此数据库未被包含,但连接表现出我们期望包含的所有行为。这里是否正在进行部分遏制?我如何确定是否属于这种情况?如果是这种情况,我将如何重新配置数据库,以便连接遵循传统的服务器登录 -> 数据库用户模型?
包含的数据库用户始终在 Azure SQL 数据库中可用。
https://learn.microsoft.com/en-us/azure/azure-sql/database/logins-create-manage?view=azuresql#create-accounts-for-non-administrator-users
我的问题是,我正在创建一个服务器登录,然后创建一个数据库用户,但我没有将用户连接到登录。因此,用户实际上是一个包含的用户,即使我的数据库本身没有定义为包含的。
创建非包含(即“传统”)用户并与其关联的服务器登录绑定的正确语法(向 David Browne - Microsoft 致敬)如下:
然后,我停用(或删除)主服务器中的登录名,并在副本服务器中创建登录名(使用第一个 SQL 语句,如上所示)。这正是我所需要的!Alice 现在可以连接到副本服务器上的数据库,但无法连接到主服务器上的数据库。(实际上,由于某种奇怪的原因,Alice 能够连接到主服务器,可以看到服务器上的所有数据库,但被拒绝访问这些数据库中的所有对象。不知道为什么会以这种方式工作,但最终效果是我所需要的 - Alice 无法查询或以其他方式操作主服务器上数据库中的任何数据。)
以下是有关数据库包含和连接身份验证模型的文章的一些链接。
https://learn.microsoft.com/en-us/sql/relational-databases/databases/contained-databases?view=sql-server-ver16
https://learn.microsoft.com/en-us/sql/relational-databases/security/authentication-access/create-a-database-user?view=sql-server-ver16
如图所示,并非每个身份验证流程都需要在服务器上登录。某些用户定义完全包含在其数据库中,并且身份验证绕过任何服务器登录。