存储过程表示命令已成功完成,但实际上并没有做任何事情

时间:2017-05-17 10:28:19

标签: sql sql-server stored-procedures

对于糟糕的头衔感到抱歉,并不确定如何说出来。

我一直在尝试在SQL Server中实现HASHBYTES函数来加密密码。我使用这个tutorial作为模板来帮助我,因为我觉得它非常详细。

我制作了这个程序来创建我的新用户;

create proc AddUser
    @User_Name nvarchar(50),
    @Password nvarchar(50),
    @Organisation_ID int,
    @Email nvarchar(254) = null,
    @Phone nvarchar(15) = null,
    @AllowPMR bit,
    @CCAddress nvarchar(254) = null,
    @Active_User bit,
    @responseMessage nvarchar(250) output
as
begin
    set nocount on
    declare @Salt uniqueidentifier=newid()
    begin try
        insert into dbo.[Users]
            (User_ID,User_Name,Password,Organisation_ID,Email,Phone,AllowPMR,PWDChanged,CCAddress,Active_User,Salt)
        values((select max(USER_ID) from Users)+1,@User_Name,HASHBYTES('SHA2_512',@Password+cast(@Salt as nvarchar(36))),@Organisation_ID,@Email,@Phone,@AllowPMR,GETDATE(),@CCAddress,@Active_User,@Salt)

        set @responseMessage='Success'
    end try
    begin catch
        set @responseMessage=ERROR_MESSAGE()
    end catch
end

然后我像这样执行AddUser存储过程;

DECLARE @responseMessage NVARCHAR(250)

exec Adduser
    @User_Name = 'username',
    @Password = 'passwords?lol',
    @Organisation_ID = 1,
    @AllowPMR = 1,
    @Active_User = 1,
    @responseMessage=@responseMessage OUTPUT

返回

  

命令已成功完成。

但是当我查看我的用户表中的内容时,没有添加任何内容。我是否误读了教程,或者我的查询有问题?

2 个答案:

答案 0 :(得分:1)

删除try / catch块。如果insert由于某种原因失败,那么您正在捕获错误。但是,您没有对它执行任何操作,因此存储过程将成功。您还可以在运行该过程后打印错误消息。删除异常处理更具戏剧性。

构造(select max(USER_ID) from Users)+1也是可疑的。您只需将user_id定义为identity列,然后让数据库为您进行递增。

答案 1 :(得分:0)

如果插入失败没有任何错误,你也可以在insert语句下使用rowcount函数,

    if(@@ROWCOUNT<=0)
    BEGIN
      set @responseMessage='Insert fail'
    END