Функция sha256 создаёт хэш. Однако есть нюанс — в качестве входящего параметра она принимает тип bytea. Соответственно если вы вызовете что-то вроде:
То результат будет получен. Однако при попытке выполнить что-то типа:
|
select sha256(txt) from users; |
Получите ошибку вида:
|
ERROR: function sha256(character varying) does not exist LINE 1: select sha256(txt) from users; ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts. SQL state: 42883 |
Т.е. не соответствие типов. Как быть? На лету преобразуем тип текст в тип bytea:
|
select sha256(txt::bytea) from users; |
Маленькая напоминалка . Синтаксис pgsql чуть отличается от mysql.
Задача: если запись не уникальна в таблице, то просто обновить дату последнего обновления.
MySQL:
|
INSERT INTO users_sessions(user_id, ssid) VALUES(10, "1") ON DUPLICATE KEY UPDATE last_updated=now() |
PostgreeSQL:
|
insert into users_sessions (user_id,ssid) values (10,'1') on conflict(ssid) do update set last_updated=now(); |
Уникальным должен быть объявлен столбец ssid
Задача: сбросить у всех пользователей пароль
Решение: воспользуемся функцией генерации пароля:
|
DECLARE vPassword text; chars text; BEGIN vPassword := ''; chars := '@#$%*abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; WHILE((select COALESCE(substring(vPassword from '.*[a-z]+.*'),'')) = '' OR (select COALESCE(substring(vPassword from '.*[A-Z]+.*'),'')) = '' OR (select COALESCE(substring(vPassword from '.*[0-9]+.*'),'')) = '') LOOP vPassword := ''; FOR i IN 1..12 LOOP vPassword := vPassword || SUBSTRING(chars, ceil(random()*LENGTH(chars))::integer, 1); END LOOP; END LOOP; return vPassword; END; |
Жизнь замечательных грибов