Я хотел бы запустить функцию create_company_maybe_race_condition()
ниже, но думаю, что это может создать состояние гонки, если функции plpg sql не выполняются последовательно. Я нахожусь на Postgres 12.
В моем реальном сценарии я включил защиту на уровне строк для всех моих таблиц. Проверка RLS основана на списке управления доступом в таблице permissions
. Когда я добавляю строку в таблицу, я не могу использовать предложение RETURNING
, поскольку в таблице permissions
еще нет строки, которая позволила бы пользователю читать объект.
CREATE TABLE companies (
PRIMARY KEY(company_id),
company_id uuid,
);
CREATE TABLE departments (
PRIMARY KEY (department_id),
department_id uuid DEFAULT gen_random_uuid(),
name text,
company_id uuid REFERENCES companies
);
/**********/
CREATE FUNCTION create_company_maybe_race_condition ()
RETURNS void AS $$
DECLARE
v_company_id := gen_random_uuid();
BEGIN
INSERT INTO companies (company_id)
VALUES (v_company_id);
INSERT INTO departments (company_id, name)
VALUES (v_company_id, 'My Department'); -- Postgres doesn't know that it depends on companies
END;
$$ LANGUAGE plpgsql;
/**********/
CREATE FUNCTION create_company_no_race_condition ()
RETURNS void AS $$
DECLARE
v_company_id uuid;
BEGIN
INSERT INTO companies (company_id)
VALUES (DEFAULT)
RETURN company_id INTO v_company_id;
INSERT INTO departments (company_id, name)
VALUES (v_company_id, 'My Department');
END;
$$ LANGUAGE plpgsql;