1

我试图通过指定Integrated Security=No然后指定用户和密码的连接字符串以代码形式确定在连接到 SQL Server 时使用了什么 SQL Server 登录。

请注意,我不是指我指定的用户(我当然知道),而是用户映射到的登录名。我刚刚在阅读有关 SQL Server 中的登录名与用户的信息,有一点很重要,那就是您总是,总是,总是需要登录才能连接,然后每个数据库都有一个用户需要登录才能访问。所以我在 SSMS 中查找映射到我总是在我关心的数据库上指定的用户的登录名,但我看不到这样的登录名。

仅供参考,我问的原因是我需要为此数据库许可一个新的旧应用程序,并且该应用程序被编码为使用 SQL Server 身份验证。我正在尝试确定是否只需要必要数据库上的用户,或者是否需要创建登录名。但现在我对一般问题本身感到好奇。

编辑 - syslogins 的快速查询仅显示 2 个登录。因此,我认为 SQLS 维护微不足道的“每个用户 1 个”登录但 SSMS 隐藏它们的理论似乎并非如此

编辑 - 查询 syslogins 或 sys.server_principals 似乎具有误导性。在我有 2 个不同的工作 SQLS(不是 Win)登录名的数据库上,我分别登录并从 sys.server_principals 中选择 *。两个不同的答案:每次我得到 sa 和我登录的登录名。我不会看到“其他”登录,尽管它显然在那里。我猜这可能与模式有关,我对此也知之甚少。无论如何,我猜测一般来说,所有用户实际上都存在登录名,尽管当我以任何一个登录名连接到 SSMS 时,我不会看到所有这些登录名。这听起来对吗?

解决了(有点) 在我有 sa 的数据库上玩耍,很明显,如果你是 sa,SSMS 只会向你显示所有登录信息,或者可能有特定的权限。否则,您的登录视图将受到限制。因此,关于为什么我没有看到预期的登录信息,这并不神秘。显然 SSMS 隐藏了它们。我说“有点”和“显然”是因为我从来没有遇到过任何记录这一点的东西。这只是一个观察。

感谢大家的帮助。

4

2 回答 2

4

除非您连接到包含的数据库,否则它是服务器级登录。如果您的意思是服务器级登录映射到的数据库用户,您可以使用:

SELECT u.name 
FROM sys.server_principals AS l
INNER JOIN sys.database_principals AS u
ON l.sid = u.sid
WHERE l.name = 'user id in your connection string';

如果您不使用包含的数据库,这就是您将如何配置您的用户:

USE master;
GO
CREATE LOGIN your_login_name 
  WITH PASSWORD = 'f00b@r!', CHECK_POLICY = OFF;
GO
USE your_database;
GO
CREATE USER your_login_name -- doesn't have to match, but should for sanity
  FROM LOGIN [your_login_name];
GO
-- then apply permissions of course.
于 2013-01-24T18:07:01.943 回答
1

通常登录映射到数据库用户

因此,例如,如果在某些不幸的情况下,应用程序期望数据库所有者访问

您将在服务器上创建此登录名(如果尚未登录),然后将其映射到相关数据库中的 dbo 用户。

如果它不是内置用户,那么您将不得不查看这个遗留应用程序已经可以访问的数据库,找出它映射到的用户在您的新数据库上创建该用户,设置所需的权限角色等然后映射登录它。

sql server版本有一些细微差别,很难一步一步做

如果应用程序登录映射到的用户是自定义用户,那么您将不得不在新数据库中找出一个等价物。虽然不必具有相同的名称(除非应用程序正在使用该名称),它甚至可以拥有更多权限。

于 2013-01-24T18:24:13.947 回答