【问题标题】:Stored Procedure that it's not working不工作的存储过程
【发布时间】:2018-08-02 14:22:27
【问题描述】:

我有这个程序,但它不起作用..我不知道为什么。任何想法我做错了什么?

CREATE PROCEDURE [dbo].[spCheckLogin]  
  (  @Username varchar(30),
     @Password varchar(15))  
AS  
BEGIN  
  Declare 
     @Result int = 0;

IF (@Password=(SELECT password from users where Username=@Username)) 

   set @Result=1 

   ELSE  

   set   @Result=0

   return @Result
END  
GO

【问题讨论】:

  • 定义:“它不起作用”。它会产生错误吗?没有达到你的预期?导致您的 SQL 服务器意外关闭?治愈世界饥饿?我们看不到你所看到的。另外,我真的希望您不要在数据库中存储未散列(带有盐)的密码。
  • 是的。使用存储过程时不要使用return。但更重要的是,永远不要将密码作为纯文本存储在数据库中。相反,store a salted hash of the password.
  • 当我从 api 调用此过程时,它说我使用它的变量没有值。事情是我在声明它时分配了值 0 :)
  • 听起来问题出在 API 上。
  • 使用set nocount on开始您的程序也是一个好主意

标签: sql-server stored-procedures


【解决方案1】:

您使用的比较不正确。它应该是这样的:

IF EXISTS (SELECT 1 from users where Username=@Username AND password = @password) 

另请注意,以明文形式存储密码不是一个好习惯。推荐阅读:Why are plain text passwords bad, and how do I convince my boss that his treasured websites are in jeopardy?

【讨论】:

    【解决方案2】:

    您希望使用输出值而不是返回值。但是返回值是整数类型,因此可能对您有用。

    您永远不会希望使用存储的普通密码,但我认为您这样做只是为了在一个爱好项目中进行测试。

    CREATE PROCEDURE [dbo].[spCheckLogin]  
      (  @Username varchar(30),
         @Password varchar(15))  
    AS  
    BEGIN  
      Declare @Result int = case 
            when exists (SELECT * 
              from users 
              where Username=@Username and password = @Password)) 
            THEN 1 
            ELSE 0
       END
       return @Result
    END  
    GO
    

    【讨论】:

      【解决方案3】:

      像metnioned一样,使用OUTPUT参数:

      CREATE PROC [dbo].[spCheckLogin] @Username varchar(30),
                                       @Password varchar(30),
                                       @Success bit OUTPUT
      AS
      BEGIN
      
          IF EXISTS (SELECT 1
                     FROM users
                     WHERE Username = @Username
                       AND Password = @Password)
          BEGIN
              SET @Success = 1;
          END
          ELSE
          BEGIN
              SET @Success = 0;
          END
      
      END
      

      但是,如上所述,不要在数据库中以未散列和未加盐的格式存储密码。如果你是,改变你的设计

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-03-13
        • 2014-09-11
        • 1970-01-01
        • 1970-01-01
        • 2019-04-16
        • 1970-01-01
        • 2013-01-05
        相关资源
        最近更新 更多