С следующей сохраненной функцией Я хотел бы проверить данные пользователя:Как гарантировать, что сохраненная функция всегда возвращает TRUE или FALSE?
CREATE OR REPLACE FUNCTION check_user(
in_social integer,
in_sid varchar(255),
in_auth varchar(32))
RETURNS boolean AS
$func$
SELECT MD5('secret word' || in_social || in_sid) = in_auth;
$func$ LANGUAGE sql IMMUTABLE;
Я буду называть его в то время как цикл через массив JSON объекты в других хранимых функциях - и буду RAISE EXCEPTION
, если она возвращает FALSE
для любого объектов JSON (и, таким образом, откат всей транзакции).
Вместо демпинг здесь исходный код моей 2-ой сохраненной функции, я подготовил 3 простых функций тестирования ниже -
CREATE OR REPLACE FUNCTION test1() RETURNS void AS
$func$
BEGIN
IF NOT check_user(42, 'user1', '56db1046fa7b664c9b3d05bf7413552a') THEN
RAISE NOTICE 'invalid user';
ELSE
RAISE NOTICE 'valid user';
END IF;
END
$func$ LANGUAGE plpgsql;
1-ая функция работает, как ожидалось и печатает valid user
.
CREATE OR REPLACE FUNCTION test2() RETURNS void AS
$func$
BEGIN
IF NOT check_user(42, 'user2', '56db1046fa7b664c9b3d05bf7413552a') THEN
RAISE NOTICE 'invalid user';
ELSE
RAISE NOTICE 'valid user';
END IF;
END
$func$ LANGUAGE plpgsql;
2-я функция работает должным образом и печатает invalid user
.
CREATE OR REPLACE FUNCTION test3() RETURNS void AS
$func$
BEGIN
IF NOT check_user(42, 'user1', NULL) THEN
RAISE NOTICE 'invalid user';
ELSE
RAISE NOTICE 'valid user';
END IF;
END
$func$ LANGUAGE plpgsql;
3-я функция не работает, как ожидалось и печатает valid user
.
Это происходит потому, что check_user()
возвращает NULL
вместо булевского значения.
COALESCE
можно обернуть вокруг check_user()
позвонить в IF
-statement ... но может быть, есть лучший способ решить эту проблему?
Во втором утверждении (для функции 'STRICT') обязательно использовать' is not true' часть? Не могу ли я просто использовать 'if NOT check_user (42, 'user1', null), а затем вызывать уведомление« недопустимый пользователь »; end if; '? Спасибо –
@AlexanderFarber: 'выражение не истинно' вернет true для' false' и 'null', а' not expression' будет возвращать 'true' только для' false', а не для 'null', что является вашей исходной проблемой. –