PL / pgSQL函数中的语句是否按顺序运行?

时间:2020-05-30 07:42:09

标签: postgresql

我想运行下面的create_company_maybe_race_condition()函数,但是认为如果plpgsql函数没有顺序运行,它可能会产生竞争条件。我正在使用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;

0 个答案:

没有答案