【发布时间】:2021-12-30 12:11:58
【问题描述】:
假设我有几个用户,每个用户都有自己的一组联系人。用户可以选择哪些第三方可以访问他们的联系人。
我可能会创建 1 个大型联系人表并有一个“所有者”列,以便我可以识别哪些联系人属于哪些用户。但是,我需要维护行级权限,以便我可以限制哪些第 3 方有权/无权访问特定的用户联系人。
相反,我认为(在这里我可能会弄错)为每个用户创建一个联系人表更有意义,例如:contact_e878df81_eba1_4a61_b592_30ac7100362a。然后我可以在单独的表中管理权限。
要创建这些“动态联系人表”,我有以下功能:
CREATE OR REPLACE FUNCTION create_contact_table(IN tbl_name text) RETURNS INT AS $$
DECLARE
table_name text;
BEGIN
table_name = tbl_name;
create table IF NOT EXISTS table_name
(
id serial not null
constraint test_pkey
primary key,
firstname varchar not null,
lastname varchar not null,
age int not null,
address varchar not null,
email varchar not null,
created timestamp default CURRENT_TIMESTAMP
);
alter table table_name
owner to postgres;
RETURN 1;
END ;
$$ LANGUAGE plpgsql;
当我执行函数时(create_contact_table(contact_e878df81_eba1_4a61_b592_30ac7100362a),创建了表,但是表的名字是table_name...
这是为什么呢?如何修复它以使表名正确?
【问题讨论】:
-
不,最好为所有所有者提供一张桌子。行级权限通常用于最多有几个用户的受控环境。但是...您似乎正在为许多同时用户设计一个应用程序。
-
你需要dynamic SQL
-
“为每个用户都有一个联系人表更有意义” - 不,绝对不是。事实上,这是一个糟糕的主意。
-
@TheImpaler 你的意思是表级权限,对吧?
-
"然后我可以在单独的表中管理权限" - 如果需要,您仍然可以在使用行级安全策略时这样做。
标签: postgresql plpgsql dynamic-sql