使用IF EXISTS和存储过程作为参数

时间:2016-03-07 17:13:50

标签: sql-server tsql stored-procedures

我有一个名为' authenticate'的存储过程。如果提供了正确的用户名和密码,则返回用户配置文件记录。现在,我正在努力让所有用户都在系统中进行身份验证'存储过程返回给我一个记录否则什么都不返回我正在尝试这样的事情:

IF EXISTS EXECUTE authenticate @UserName, @Password
BEGIN    
    SELECT * from Users;
END

我收到错误:关键字' EXECUTE'附近的语法不正确。 我有什么想法吗?

3 个答案:

答案 0 :(得分:3)

您可以将程序转换为功能:

O(k^s)

答案 1 :(得分:1)

EXISTS获取SELECT子查询而不是存储过程的结果。见MSDN。您需要在SELECT语句中从authenticate复制EXISTS,或者在EXISTS之前填入包含结果的表格。 e.g。

INSERT INTO #authenticate (col1, col2, col3)
EXEC authenticate @UserName, @Password

IF EXISTS (SELECT 1 FROM #authenticate)
BEGIN    
    SELECT * from Users;
END

答案 2 :(得分:0)

我看到了几个设计问题:

1

方法“验证”会返回一些行集。为什么?它被称为“authenticate” - 而不是“SelectAuthenticatedUserInfo”。我假设这个程序不止一个工作。

将其拆分为真正的身份验证方法,该方法可能会给出一个带有session-id或位标志yes / no = ok / fault的输出变量。并创建另一个类似dbo.SelectAuthUserProfile的过程,在应用程序启动时调用一次,在dbo.Authenticate内调用,如果成功,则返回带有相应数据的行集。

2

此选择看起来像是一项常规工作,我的意思是 - 它不太可能是应用启动或登录/注销的一次性“低级”工作。您为什么要执行身份验证方法?每次要选择某些数据时,您是否认真想要传递用户名和(!)密码?身份验证是每个会话的一次性工作(甚至更长的情况)。

对用户进行身份验证,然后检查他是否已经身份验证。将会话数据存储在某个地方,只传递一个密钥或其他东西(甚至不传递任何东西 - 有##或#表,spid +登录时间等一些技巧)。

3

在我看来,每个用户都不能查看Users表的内容。访问可以由内部sql-server的工具控制。

为管理员特定的存储过程创建模式,为这些超级用户创建角色,授予此模式的过程。这将排除普通用户执行此类过程的任何可能性。

4

进一步考虑管理对系统不同部分的访问。对于问题“此用户是否允许执行此类操作?”您正在尝试回答“他已通过身份验证!”好的,经过身份验证。所以呢?他有权限吗?

验证用户一次,然后 - 控制他的权限。常规proc中不能有“authenticate”方法。但是“IsPermitted”我猜应该是。 (这个项目与第一个 - 对于一个过程的许多责任相关)

5

此外,请注意:允许查看这些订单,但不允许查看那些。你可以用if exec then这个过程调用来安排它吗?