Sql 获取应用程序用户角色,使用存储过程登录的有效用户的名称

Sql 获取应用程序用户角色,使用存储过程登录的有效用户的名称,sql,sql-server,stored-procedures,query-optimization,Sql,Sql Server,Stored Procedures,Query Optimization,我制作了一个存储过程,用于验证用户登录并获取有效用户的角色和名称。我有些困惑,请让我说清楚 这是优化的方法吗? 如果存在,我使用什么?选择1检查用户名和密码,如果返回true,则仅获取有效用户的角色和名称 @v_out_login_消息返回0,为什么? 创建过程p_用户登录 @用户名varchar20, @密码varchar10, @v_out_角色字符输出, @v_out_name varchar50输出, @v_out_login_message int=0输出 像 开始 从用户信息中选择

我制作了一个存储过程,用于验证用户登录并获取有效用户的角色和名称。我有些困惑,请让我说清楚

这是优化的方法吗? 如果存在,我使用什么?选择1检查用户名和密码,如果返回true,则仅获取有效用户的角色和名称 @v_out_login_消息返回0,为什么? 创建过程p_用户登录 @用户名varchar20, @密码varchar10, @v_out_角色字符输出, @v_out_name varchar50输出, @v_out_login_message int=0输出 像 开始 从用户信息中选择@v_out_role=role、@v_out_name=name 其中user\u name=@user\u name and password=@password and status=1; 如果@@rowcount=0 设置@v_out\u login\u message=1-用户可以登录 else set@v\u out\u login\u message=0-登录无效 正如微软所说的那样:

@@ROWCOUNT返回受上一条语句影响的行数

@@rowcount=0表示选择的结果不匹配。因此,您应该将代码修改为:

if @@rowcount > 0 
    set @v_out_login_message = 1 -- user can login
else set @v_out_login_message = 0 -- invalid login
正如Hank已经说过的,@@ROWCOUNT=0检查应该测试1,而不是0

至于代码,我可能会这样写:

create procedure p_user_login
(
    @user_name              varchar(20),
    @password               varchar(10),    
    @v_out_role             char output,
    @v_out_name             varchar(50) output,
    @v_out_login_message    int = 0 output
)
as
begin
    -- init
    SELECT @v_out_role = NULL,
           @v_out_name = NULL,
           @v_out_login_message = 0 -- invalid login

    -- do lookup
    select @v_out_role = role, 
           @v_out_name = name,
           @v_out_login_message = 1 -- user can login
      from user_information
     where user_name = @user_name 
       and password = @password 
       and status = 1;

end
=>如果在用户_信息中找不到有效记录,则所有变量都会更改,从而保留其“init”值


备注:我不知道您的应用程序,但您似乎将自己限制在“每个用户只扮演一个角色”的场景中,这是出于设计吗?

谢谢您的更正。我在编码时犯了打字错误。该死的!!!你能同时回答1和2吗。谢谢你回答问题1。我知道,没有什么可以优化性能的。但是,为了安全问题,最好对密码进行加密。关于问题2,我不明白为什么只获取有效用户的角色和名称。如果你说的是登录信息,应该通过问题3来解决。谢谢你的回复和评论。是的,一个用户一个角色在first select语句中,既然我最初给v_out_login_消息赋值为0,为什么还要给它赋值呢?我想你误解了CREATE过程的语法。您没有将0分配给@v_out_login_message,而是将默认值0分配给参数,该参数将在调用没有给定参数的存储过程时使用。实际上,在我的示例中,如果您不初始化值,并且在表中找不到用户,那么参数的值将保留调用方传递给存储过程的任何值!从手册中: