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

时间:2011-03-23 17:08:10

标签: sql-server

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

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

2 个答案:

答案 0 :(得分:1)

有两种方法可以解决这个问题:

1)直接查询SQL Server表以查找匹配项。您可能需要浏览视图,而不是直接访问表。也许,从Sys.sql_logins

中选择*

需要在Sys.sql_logins.password_hash

中找到一种散列密码的方法,以便与散列版本进行比较

从SQL Server 2008开始,他们添加了函数PWDCOMPARE()。这显然是MS打算解决这个问题的方式。

所以,在2008年,我认为你会查询它 select * from Sys.sql_logins where name ='login'和PWDCOMPARE('password',Sys.sql_logins.password_hash)= 1

奇怪的是,我刚刚在SQL 2005上尝试了这个,并且该功能似乎存在。

2)通过调用OPENDATASOURCE()尝试连接到SQL服务器并测试失败。 OPENDATASOURCE()的MSDN页面位于:http://msdn.microsoft.com/en-us/library/aa276845(v=sql.80).aspx

答案 1 :(得分:1)

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