Генерация идентификатора пользователя посредством PL/PGSQL
Возможности реляционных баз данных PostgreSQL можно существенно расширить за счет процедур на специальном языке — PL/PSQL. Он очень прост, существует давно и поэтому весьма стабилен. Дополнительным удобством является то, что вызов процедуры — это транзакция, поэтому если при ее выполнении происходит какой-нибудь сбой, данные не теряются. Просто происходит откат к прежнему состоянию.
На PL/SQL можно не только производить действия с таблицами, но и писать программы, возвращающие те или иные значения. Вот как, например, можно генерировать идентификатор пользователя, построенный по принципу «3 буквы 6 цифр» (при этом, правда, должен поддерживаться тип данных uuid, но о нем в другой раз):
На PL/SQL можно не только производить действия с таблицами, но и писать программы, возвращающие те или иные значения. Вот как, например, можно генерировать идентификатор пользователя, построенный по принципу «3 буквы 6 цифр» (при этом, правда, должен поддерживаться тип данных uuid, но о нем в другой раз):
create or replace function new_uid() returns varchar(9) as $$
declare
new_uuid text := uuid_generate_v4();
letters text := regexp_replace(upper(new_uuid), '[0-9]|-', '', 'g');
digits text := regexp_replace(upper(new_uuid), '[A-Z]|-', '', 'g');
uid_to_return varchar(9) := substring(letters from 1 for 3)||substring(digits from 1 for 6);
rw users%rowtype;
begin
if uid_to_return !~ '[A-Z]{3}[0-9]{6}' then
raise exception 'Какой-то херовенький идентификатор получился - %. Такое бывает редко, попробуйте еше раз.', uid_to_return;
end if;
select * from users where id = new_uuid into rw;
if found then
raise exception 'Пользователь с таким идентификатором уже есть в базе.';
end if;
return uid_to_return;
end
$$ language plpgsql;
- —
- 16 декабря 2012, 17:32
Комментарии (1)
RSS свернуть / развернутьSergei_T
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.