у него дефолтное значение: my_function().
Для проверки на уникальность генерации дефолтного значения мне в функции приходится делать запрос к таблице users и к полю id. А для этого приходится прокидывать в функцию название таблицы и поля: my_function('users', 'id').
Вот и появился в связи с этим вопрос - можно ли как-то во время выполнения функции получить контекст - для какого поля какой таблицы она выполняется, чтобы не прокидывать аргументы и оставить my_function() by default?
Что-то типа:
CREATE OR REPLACE FUNCTION my_function() RETURN text AS $$
BEGIN
SELECT 1 FROM current_table WHERE current_column = ...
...
END
trigger function
Хм а последовательность то чем не угодила? Или I’d осмысленный?
Ну насколько я понимаю, тригеры нужно навешивать определенные действия. Тут же я говорю о дефолтном значении колонки: CREATE TABLE users ( id integer DEFAULT my_function() CONSTRAINT users_pkey PRIMARY KEY, В случае с триггерами надо делать что-то типа: CREATE TABLE users ( id integer CONSTRAINT users_pkey PRIMARY KEY, ... ) CREATE TRIGGER set_default_users_id BEFORE INSERT OF id ON users FOR EACH ROW EXECUTE FUNCTION my_function(); Мне тут больше нравится всё-таки первый вариант
Ну там что-то типа рандомной строки с префиксом: usr_jsSJWn3282jwnsW
А проверять то зачем, если вы сами генеририруете?
Ну на случай если такая запись уже есть в таблице. Вот сама функция. Проще наверно показать, чем говорить: 5 │ Usage example: 6 │ SELECT prefixed_id_generator(table_name, 'prefix', uniq_column) 7 │ # prefix_jHwn38Nwhs6qP6k 8 │ 9 │ If a prefix is not set, it adds a dash before anyway. 10 │ By default, check the 'id' column. You can redefine it with a third arg. 11 │ */ 12 │ 13 │ CREATE OR REPLACE FUNCTION prefixed_id_generator(tbl_name text, prefix text DEFAULT '', uniq_column text DEFAULT 'id') RETURNS text AS $$ 14 │ DECLARE 15 │ new_id text; 16 │ done bool; 17 │ postfix text; 18 │ BEGIN 19 │ done := false; 20 │ WHILE NOT done LOOP 21 │ postfix := (SELECT string_agg(substr('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', ceil (random() * 62)::integer, 1), '') 22 │ FROM generate_series(1, 15)); 23 │ new_id := prefix || '_' || postfix; 24 │ EXECUTE format('SELECT NOT exists(SELECT 1 FROM %s WHERE %s=$1)', tbl_name, uniq_column) INTO done USING new_id; 25 │ END LOOP; 26 │ RETURN new_id; 27 │ END; 28 │ $$ LANGUAGE PLPGSQL VOLATILE;
Не понимаю в чем смысл
Вы вот на каждую вставку выполнять собираетесь код на plogsql Хотя модно в url просто иметь user#102251126
Обсуждают сегодня