本地MSSQL正常运行的Loginuser存储过程在GoDaddy MyLittleAdmin中异常
解决Loginuser存储过程在GoDaddy MyLittleAdmin执行异常的问题
先把你的存储过程代码格式化出来,方便排查:
alter proc [dbo].[Loginuser] @Username nvarchar(100), @Password nvarchar(100) as begin Declare @Retrycount int Declare @count int Declare @Accountlocked bit Declare @Rolename nvarchar(20) select @Accountlocked = Islocked from tbl_Userinfo where Email = @Username if(@Accountlocked = 1) begin select 1 as Accountlocked ,0 as authenticated,0 as Retryattempts end -- 省略后续未粘贴的代码 end
下面是几个大概率导致问题的原因和对应的解决步骤:
权限不匹配
本地你大概率用的是高权限账号(比如sa),但GoDaddy给的数据库账号权限通常有限。你需要检查两个点:- 确认GoDaddy的账号有执行
[dbo].[Loginuser]的权限; - 确认该账号能读取
tbl_Userinfo表。
如果你的账号有授权权限,可以在MyLittleAdmin里执行这两句来补全权限:
GRANT EXECUTE ON [dbo].[Loginuser] TO [你的GoDaddy数据库用户名]; GRANT SELECT ON [dbo].[tbl_Userinfo] TO [你的GoDaddy数据库用户名];- 确认GoDaddy的账号有执行
NULL值处理逻辑的坑
本地和GoDaddy服务器的ANSI_NULLS设置可能不一样。当传入的@Username在表中不存在时,@Accountlocked会被赋值为NULL。如果GoDaddy那边开启了默认的ANSI_NULLS,那么@Accountlocked = 1这个判断会返回UNKNOWN,不会进入对应的分支;而如果本地你关闭了这个设置,判断结果会是FALSE,逻辑就不一样了。
改一下存储过程的判断逻辑,明确处理NULL情况:-- 替换原来的if判断 IF (@Accountlocked IS NOT NULL AND @Accountlocked = 1) BEGIN SELECT 1 AS Accountlocked, 0 AS authenticated, 0 AS Retryattempts END -- 最好再加个账号不存在的分支 ELSE IF (@Accountlocked IS NULL) BEGIN SELECT 0 AS Accountlocked, 0 AS authenticated, 0 AS Retryattempts, '用户不存在' AS Message END参数传递格式错了
在MyLittleAdmin里执行存储过程时,参数传递要注意细节:- 传递nvarchar类型的参数时,必须加
N前缀,比如N'your@email.com',不然会被隐式转成varchar,和表中Email字段的nvarchar类型不匹配,查不到数据; - 如果参数值有特殊字符,要正确转义。
正确的执行语句应该是这样的:
EXEC [dbo].[Loginuser] @Username = N'test@example.com', @Password = N'yourpassword';- 传递nvarchar类型的参数时,必须加
数据库上下文没切对
有时候在MyLittleAdmin里默认打开的是系统数据库(比如master),直接执行存储过程会找不到对象。先确认你已经切换到了存储过程所在的业务数据库,再执行。存储过程代码没同步
有可能你在本地修改了存储过程,但没把最新代码同步到GoDaddy服务器。重新在MyLittleAdmin里执行一遍ALTER PROCEDURE语句,确保两边代码一致。
内容的提问来源于stack exchange,提问作者ch gopi
相关产品推荐
相关产品推荐

