Sql 函数未返回预期值
我创建了一个函数,理论上,成功更改密码时返回true,反之返回false 该功能定义为:Sql 函数未返回预期值,sql,postgresql,sql-update,user-defined-functions,plpgsql,Sql,Postgresql,Sql Update,User Defined Functions,Plpgsql,我创建了一个函数,理论上,成功更改密码时返回true,反之返回false 该功能定义为: CREATE OR REPLACE FUNCTION database."changePassword"(username character varying, newpassword character varying, oldpassword character varying) RETURNS boolean AS $BODY$ UPDATE database.users SET hash = MD5
CREATE OR REPLACE FUNCTION database."changePassword"(username character varying, newpassword character varying, oldpassword character varying) RETURNS boolean AS
$BODY$
UPDATE database.users SET hash = MD5($2) WHERE (username = $1 AND hash = MD5($3));
SELECT EXISTS(SELECT 1 FROM datsabase.users WHERE username = $1 AND hash = MD5($2))
$BODY$
LANGUAGE sql VOLATILE NOT LEAKPROOF
COST 100;
问题是,当我调用SELECT数据库之类的函数时,“changePassword”('usrNm','newPassword','oldOne')代码>,首先我得到了预期的true,并且数据库中的值发生了更改
当我使用相同的参数再次(一次又一次)调用函数时,它也会返回true,但情况不应该是这样,因为密码现在已更改,并且通过函数调用发送的旧密码不正确
我做错什么了吗
PostgreSQL版本是9.3.1。
我从pgAdmin接口和PHP脚本调用了该函数,同样的问题。该函数的返回值是SELECT
语句的结果。当存储的用户哈希与第二个参数(newpassword
)的哈希匹配时,结果为真。当密码更改为新密码时,此检查始终成功,并且函数为同一参数返回true,尽管update语句在第二次调用后不会更新任何行。您应该更改逻辑,而不是查询匹配的用户和密码,而是检查任何行是否更新。函数的返回值是SELECT
语句的结果。当存储的用户哈希与第二个参数(newpassword
)的哈希匹配时,结果为真。当密码更改为新密码时,此检查始终成功,并且函数为同一参数返回true,尽管update语句在第二次调用后不会更新任何行。您应该更改逻辑,而不是查询匹配的用户和密码,而是检查任何行是否更新。函数的返回值是SELECT
语句的结果。当存储的用户哈希与第二个参数(newpassword
)的哈希匹配时,结果为真。当密码更改为新密码时,此检查始终成功,并且函数为同一参数返回true,尽管update语句在第二次调用后不会更新任何行。您应该更改逻辑,而不是查询匹配的用户和密码,而是检查任何行是否更新。函数的返回值是SELECT
语句的结果。当存储的用户哈希与第二个参数(newpassword
)的哈希匹配时,结果为真。当密码更改为新密码时,此检查始终成功,并且函数为同一参数返回true,尽管update语句在第二次调用后不会更新任何行。您应该更改逻辑,而不是查询匹配的用户和密码,而是检查任何行是否已更新。如果您想返回任何密码是否已更改,您只需在plpgsql函数中返回特殊变量,如下所示(通过@Pavel输入简化):
或者更简单地说,使用RETURNING
子句。这也适用于普通sql函数:
CREATE OR REPLACE FUNCTION database."changePassword"(
username character varying
,newpassword character varying
,oldpassword character varying
) RETURNS boolean AS
$func$
UPDATE database.users
SET hash = MD5($2)
WHERE username = $1
AND hash = MD5($3)
RETURNING TRUE;
$func$
LANGUAGE sql VOLATILE NOT LEAKPROOF;
如果没有更新行,则不会返回任何内容。否则,您将获得TRUE
如果您想返回密码是否已更改,您只需返回plpgsql函数中的特殊变量,如下所示(通过@Pavel的输入简化):
或者更简单地说,使用RETURNING
子句。这也适用于普通sql函数:
CREATE OR REPLACE FUNCTION database."changePassword"(
username character varying
,newpassword character varying
,oldpassword character varying
) RETURNS boolean AS
$func$
UPDATE database.users
SET hash = MD5($2)
WHERE username = $1
AND hash = MD5($3)
RETURNING TRUE;
$func$
LANGUAGE sql VOLATILE NOT LEAKPROOF;
如果没有更新行,则不会返回任何内容。否则,您将获得TRUE
如果您想返回密码是否已更改,您只需返回plpgsql函数中的特殊变量,如下所示(通过@Pavel的输入简化):
或者更简单地说,使用RETURNING
子句。这也适用于普通sql函数:
CREATE OR REPLACE FUNCTION database."changePassword"(
username character varying
,newpassword character varying
,oldpassword character varying
) RETURNS boolean AS
$func$
UPDATE database.users
SET hash = MD5($2)
WHERE username = $1
AND hash = MD5($3)
RETURNING TRUE;
$func$
LANGUAGE sql VOLATILE NOT LEAKPROOF;
如果没有更新行,则不会返回任何内容。否则,您将获得TRUE
如果您想返回密码是否已更改,您只需返回plpgsql函数中的特殊变量,如下所示(通过@Pavel的输入简化):
或者更简单地说,使用RETURNING
子句。这也适用于普通sql函数:
CREATE OR REPLACE FUNCTION database."changePassword"(
username character varying
,newpassword character varying
,oldpassword character varying
) RETURNS boolean AS
$func$
UPDATE database.users
SET hash = MD5($2)
WHERE username = $1
AND hash = MD5($3)
RETURNING TRUE;
$func$
LANGUAGE sql VOLATILE NOT LEAKPROOF;
如果没有更新行,则不会返回任何内容。否则,您将得到TRUE
这个“FOUND”变量是布尔值,因此您可以简化代码-只需使用“RETURN FOUND”@PavelStehule:当然!我通常不会错过这样一个简单化的好机会。“FOUND”变量是布尔变量,因此您可以简化代码-只需使用“RETURN FOUND”@PavelStehule:当然!我通常不会错过这样一个简单化的好机会。“FOUND”变量是布尔变量,因此您可以简化代码-只需使用“RETURN FOUND”@PavelStehule:当然!我通常不会错过这样一个简单化的好机会。“FOUND”变量是布尔变量,因此您可以简化代码-只需使用“RETURN FOUND”@PavelStehule:当然!我通常不会错过这样一个简单化的好机会。应用这个。