Sql server 在存储过程内部,测试SQL Server用户是否存在,以及他们的密码是否有效

Sql server 在存储过程内部,测试SQL Server用户是否存在,以及他们的密码是否有效,sql-server,Sql Server,我需要创建执行以下操作的SQL Server存储过程: 将数据库用户名和密码作为参数。 如果用户不存在或密码无效,请返回空行集。 否则,执行查询并返回其结果。 我不知道如何执行步骤2。有什么想法吗?有两种方法: 1直接查询SQL Server表以查找匹配项。您可能需要浏览视图,而不是直接访问表。也许可以从Sys.sql\u登录中选择* 需要在Sys.sql\u logins.password\u hash中找到散列密码的方法,以便与散列版本进行比较 从SQL Server 2008开始,他们添加

我需要创建执行以下操作的SQL Server存储过程:

将数据库用户名和密码作为参数。 如果用户不存在或密码无效,请返回空行集。 否则,执行查询并返回其结果。
我不知道如何执行步骤2。有什么想法吗?

有两种方法:

1直接查询SQL Server表以查找匹配项。您可能需要浏览视图,而不是直接访问表。也许可以从Sys.sql\u登录中选择*

需要在Sys.sql\u logins.password\u hash中找到散列密码的方法,以便与散列版本进行比较

从SQL Server 2008开始,他们添加了函数PWDCOMPARE。这显然是微软想要解决这个问题的方式

所以,在2008年,我想你会质疑 从Sys.sql\u logins中选择*,其中name='login'和PWDCOMPARE'password',Sys.sql\u logins.password\u hash=1

奇怪的是,我刚刚在SQL2005上尝试了这个功能,这个函数似乎已经存在了


2尝试通过调用OPENDATASOURCE连接到SQL server,并测试是否失败。OPENDATASOURCE的MSDN页面位于:

为什么不让SQL Server为您这样做呢。毕竟,这就是内置安全方案的目的。只需向用户或角色授予包含数据查询的存储过程的权限。然后,在调用SP的应用程序中,您将使用该用户的登录凭据打开到DB的连接。如果用户无效,则他们无法连接,您可以捕获异常。如果用户在数据库中有效,但没有存储过程的权限,则可以捕获异常。

我可以通过查询sys.sysusers找到该用户是否存在,但如何测试密码是否有效?我认为您不想与用户进行比较-它们是特定于数据库的。您可能对系统登录更感兴趣。基本上,我想做的是,连接到指定用户A的数据库,然后通过该连接,测试同一数据库中是否存在另一个用户B,以及他的密码是否为X。用户B不需要登录。您确定您真的是指用户吗?用户只是特定登录对数据库拥有的一组权限。对于登录可以访问的每个数据库,登录都有一个用户。当您谈论要连接的“密码”时,该密码属于登录名,而不是用户。我的意思是我想测试用户B是否可以连接密码X,但我实际上不想连接为B。实际上,用户不会直接连接到DB。我有一个Web应用程序,它使用Web服务,而Web服务又连接到数据库。我不希望Web服务能够完成用户可以直接完成的所有工作。