Dziękuję za odzew, sprawdzę to dam znać, z baz danych to ja cienki jestem
Dodane:
No cóż, nie do końca działa, nie stworzy funkcji.
Strukturę tabeli public.vmail.mailbox mam taką:
Kod: Zaznacz cały
username(varchar)[username jest pełnym mailem], password(varchar), name, maildir, itd
interesuje mnie stworzenie funkcji, która aktualizuje hash MD5 pola password.
Znalazłem coś takiego:
Kod: Zaznacz cały
CREATE OR REPLACE FUNCTION update_passwd(hash text, account text) RETURNS integer AS $$
DECLARE
res integer;
BEGIN
UPDATE passwd SET password = hash
WHERE login = split_part(account, '@', 1)
AND domainid = (SELECT id FROM domains WHERE name = split_part(account, '@', 2))
RETURNING id INTO res;
RETURN res;
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;
Kod: Zaznacz cały
CREATE FUNCTION update_password (oldpass text, cryptpass text, user text) RETURNS text
MODIFIES SQL DATA
BEGIN
DECLARE currentsalt varchar(20);
DECLARE error text;
SET error = 'incorrect current password';
SELECT substring_index(substr(user.password,4),_latin1'$',1) INTO currentsalt FROM users WHERE username=user;
SELECT '' INTO error FROM users WHERE username=user AND password=ENCRYPT(oldpass,currentsalt);
UPDATE users SET password=cryptpass WHERE username=user AND password=ENCRYPT(oldpass,currentsalt);
RETURN error;
END
ale też nie bardzo chcą działać.
Log postgresa po wykonaniu zapytania dla pierwszej funkcji:
Kod: Zaznacz cały
2011-10-19 14:01:08 CEST ERROR: relation "passwd" does not exist at character 8
2011-10-19 14:01:08 CEST QUERY: UPDATE passwd SET password = $1 WHERE login = split_part( $2 , '@', 1) AND domainid = (SELECT id FROM domains WHERE name = split_part( $2 , '@', 2)) RETURNING id
2011-10-19 14:01:08 CEST CONTEXT: PL/pgSQL function "update_passwd" line 4 at SQL statement
2011-10-19 14:01:08 CEST STATEMENT: SELECT update_passwd('$HASH.', 'mail@domena.pl')
Próba stworzenia drugiej z tych funkcji, którą znalazłem:
Kod: Zaznacz cały
2011-10-19 13:57:32 CEST ERROR: syntax error at or near "user" at character 64
2011-10-19 13:57:32 CEST STATEMENT: CREATE FUNCTION update_password (oldpass text, cryptpass text, user text) RETURNS text
MODIFIES SQL DATA
BEGIN
DECLARE currentsalt varchar(20);
DECLARE error text;
SET error = 'incorrect current password';
SELECT substring_index(substr(user.password,4),_latin1'$',1) INTO currentsalt FROM users WHERE username=user;
SELECT '' INTO error FROM users WHERE username=user AND password=ENCRYPT(oldpass,currentsalt);
UPDATE users SET password=cryptpass WHERE username=user AND password=ENCRYPT(oldpass,currentsalt);
RETURN error;
END