Выполняются ли операторы в функции PL / pg SQL последовательно? - PullRequest
0 голосов
/ 30 мая 2020

Я хотел бы запустить функцию 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...