在開始使用Sybase和SQL Server多年之後,我開始了一個PostgreSQL項目,並且對它的怪癖很陌生,但到目前爲止印象非常深刻。在PostgreSQL觸發器中分配變量以輸出參數
我寫了一個返回OUT參數的小函數。我傳入一個清除密碼,該函數返回加密的密碼和鹽。那就是:
CREATE OR REPLACE FUNCTION iSecGenPwdSalt(pwdin text, out salt text, out userpassword text)
AS
$BODY$
DECLARE
BEGIN
-- Generate a salt...
salt = gen_salt('bf', 10);
-- Now generate the password hash...
userpassword = crypt(pwdin, salt);
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION iSecGenPwdSalt(text, out text , out text) OWNER TO postgres;
我想打電話觸發器中此功能,並使用值來填充密碼和鹽列我有,但我不能完全理解的語法。我已經嘗試過多個主題的變體,但我仍然遇到問題。
select salt, userpassword from iSecGenPwdSalt('mymagicpassword');
它的結果漂亮,所以我想調用該函數並返回結果爲一對變量觸發,所以我可以分配值回報。
這裏是我的代碼:
SELECT usersalt=salt, userpwd=userpassword
FROM iSecGenPwdSalt(NEW.systemuserpassword);
我得到的錯誤是這樣的:
ERROR: query has no destination for result data HINT: If you want to discard the results of a SELECT, use PERFORM instead. CONTEXT: PL/pgSQL function "isec_trg_systemuser" line 13 at SQL statement
所以,簡單地分配給一對變量,從OUT參數觸發得出一個結果是造成了我的悲傷。
我認爲你是對的 - 我必須改變我解決問題的方式。也許我在思考Sybase/SQL Server選擇變量的思路。 SELECT INTO NEW.columnname似乎是一個很好的解決方法,也許是比我想實現的更好的方法。 – Noodle