以下文章介绍了 AZURE“服务器管理员”用户。 https://learn.microsoft.com/en-us/azure/sql-database/sql-database-manage-logins
该用户可以访问每个数据库,但不幸的是 HAS_DBACCESS(%database_name%) 函数无法返回 1,因此我需要其他方法来检测该用户并识别他们可以访问所有数据库。
我尝试了许多其他方法,包括:
- IS_MEMBER ('db_owner')
- IS_SRVROLEMEMBER ('serveradmin')
- IS_SRVROLEMEMBER('系统管理员')
注意:奇怪的是,HAS_DBACCESS(%database_name%) 实际上返回 NULL。
任何建议将不胜感激。
以下查询是在以rootadmin 身份登录时从 Master 数据库运行的,这是我的服务器管理员用户的名称。
编辑:当我切换到使用“Demo”数据库时,查询结果发生了变化,HAS_DBACCESS(t.name) 为 Master 数据库返回 NULL,为“Demo”数据库返回“1”。
所以现在我很困惑。
使用 Microsoft SQL Azure 数据库,您的用户将不是任何服务器角色的成员,您也无权访问该信息。因此,IS_SRVROLEMEMBER 实际上会返回零。您只能在数据库级别而不是服务器级别访问——除非您构建和使用 SQL VM。
从 Microsoft 文档中,您可以使用以下内容对此进行测试:
但是,您的用户将有权访问数据库级别的角色。从 Microsoft 文档中,您可以测试此示例:
但是有一个警告,您需要在您的个人数据库而不是主数据库的上下文中(我的数据库称为 TESTING):
一旦您处于正确的数据库上下文中,以下函数等就会按预期工作:
笔记:
select HAS_DBACCESS('db_name') 将返回 NULL 值,因为没有名为 'db_name' 的数据库。您可以将其更改为 db_name() 函数。例如,
或者,硬编码数据库名称——在我的例子中是 TESTING。