PostgreSQL编写登录校验函数:匹配用户名密码返回1否则返回0
PostgreSQL登录校验函数实现方案
原代码问题汇总
- 误用SQL Server专属语法
SET nocount ON,PostgreSQL plpgsql无此语法,需直接删除 - 错误将result声明为输入默认参数,实际应作为函数内部局部变量声明
- 返回类型设置错误,需求返回1/0整数,原代码设置为VARCHAR(50),需修改为INT
- 赋值语法不符合plpgsql规则,plpgsql中变量赋值需使用
:=运算符,不能使用SET语句 - 缺少RETURN返回语句,函数执行后无法输出结果值
修正后可直接运行的代码
CREATE FUNCTION checkUsername (Iusername VARCHAR(50), Iuserpassword VARCHAR(50)) RETURNS INT AS $$ DECLARE result INT := 0; BEGIN IF EXISTS (SELECT * FROM users WHERE username = Iusername AND userpassword = Iuserpassword) THEN result := 1; ELSE result := 0; END IF; RETURN result; END; $$ LANGUAGE plpgsql;
简化版实现(可选)
无需声明变量和IF分支,直接将EXISTS查询的布尔结果转换为整数返回,代码更精简:
CREATE FUNCTION checkUsername (Iusername VARCHAR(50), Iuserpassword VARCHAR(50)) RETURNS INT AS $$ BEGIN RETURN (SELECT EXISTS(SELECT * FROM users WHERE username = Iusername AND userpassword = Iuserpassword))::INT; END; $$ LANGUAGE plpgsql;
提示:生产环境禁止明文存储用户密码,需使用bcrypt等不可逆加密算法对密码做哈希处理后再存储,校验时直接对比哈希值即可。
内容的提问来源于stack exchange,提问作者salif shaikh
相关产品推荐
相关产品推荐

