用下面的存儲功能,我想驗證用戶數據:如何確保存儲的函數總是返回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對象(並因此回滾整個事務)。
除了在此處傾倒我的第二個存儲功能的源代碼,我已經準備好以下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;
第二個函數按預期工作並打印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;
預期和打印valid user
第三屆功能不起作用。
發生這種情況是因爲check_user()
返回NULL
而不是布爾值。
COALESCE
可能會纏在check_user()
調用IF
-statement ...但有沒有更好的方法來解決這個問題?
在第二條語句(對於'STRICT'函數)是否必須使用'is not true'部分?我不能只使用'如果不是check_user(42,'user1',null),然後通知'無效用戶';結束如果;'?謝謝 –
@AlexanderFarber:'表達式不是真的'對於'false'和'null'都會返回true,'not表達式'只會對'false'返回'true'而不是'null',這是你原來的問題。 –