我可以使用我的 ID 和密码访问此服务器上的任何数据库。这是我的连接字符串:
数据源=my.database;初始目录=main_table;用户 ID=my_user_id;密码=my_password;
它可以工作,但现在我想拒绝 my_user_id 的访问。问题是 - 我在数据库中找不到该用户。
这怎么可能?它看起来像一个隐形帐户。它没有在任何地方列出,但是 SQL 授予该帐户权限。
我很困惑,我应该在哪里寻找这个帐户?
答案1
SELECT CASE
WHEN sysadmin = 1
THEN 'You have system admin access'
ELSE 'Normal user'
END
FROM sys.syslogins
WHERE loginname LIKE '<loginname>'
上述查询将返回“您具有系统管理员权限”意味着提供的登录具有 sysadmin 权限,否则提供的登录不具有 sysadmin 权限。
答案2
解决方案:
服务器登录名必须与数据库用户关联才能在数据库中执行操作。两者都是校长在 SQL Server 中。在连接字符串中,用户 ID 的值是服务器登录名。您可以尝试检查当前数据库的此服务器登录的用户映射:
USE main_table -- Server database
SELECT
sp.name AS LoginName,
sp.type_desc AS LoginType,
dp.name AS DatabaseUserName,
r.name AS DatabaseRoleName
FROM sys.server_principals sp
LEFT JOIN sys.database_principals dp ON dp.sid = sp.sid
LEFT JOIN sys.database_role_members drm ON drm.member_principal_id = dp.principal_id
LEFT JOIN sys.database_principals r ON r.principal_id = drm.role_principal_id
WHERE sp.name = 'my_user_id' -- Server Login
笔记:
使用您当前的连接字符串,我认为您尝试使用 SQL 身份验证连接到 SQL Server。然后您的 SQL 登录名将映射到数据库用户(服务器登录名不等于数据库用户)。如果您想使用 Windows 身份验证进行连接,在大多数情况下,需要从连接字符串中删除用户 ID 和密码并包含 IntegratedSecurity=true。