在其他表格中,我有以下划线“ _XXXXXXX”开头的表格名称。我需要创建一个用户,该用户只能对这些“ _XXXX”表进行查询(没有其他功能)没有,而不能查看/查找其他表(不是以“ _XXXXX”开头)。>
如何在postgres psql中做到这一点?:
我尝试了
GRANT SELECT ON TABLE "_*" TO username;
我得到以下信息:
错误:关系“ _ *”不存在
感谢您的帮助。
谢谢
当我在PgAdmin4查询编辑器中执行以下代码时:
DO
$$
DECLARE
r record;
BEGIN
FOR r IN SELECT c.relname,
n.nspname
FROM pg_class c
INNER JOIN pg_namespace n
ON n.oid = c.relnamespace
WHERE n.nspname = 'Schemas'
AND c.relkind = 'r'
AND c.relname LIKE '$_%'
ESCAPE '$' LOOP
EXECUTE 'GRANT SELECT ON "' || r.nspname || '"."' || r.relname || '" TO kpidata;';
END LOOP;
END;
$$
LANGUAGE plpgsql;
我得到以下响应,并且没有任何变化(对于创建的用户'kpidata',所有用户仍然具有相同的访问权限)。我确定是我自己不了解事情的运作方式
我的数据库结构如下:
答案 0 :(得分:0)
您可以使用DO
块遍历名称以下划线开头的所有表,为其构建语句并执行语句。
DO
$$
DECLARE
r record;
BEGIN
FOR r IN SELECT c.relname,
n.nspname
FROM pg_class c
INNER JOIN pg_namespace n
ON n.oid = c.relnamespace
WHERE n.nspname = 'public'
AND c.relkind = 'r'
AND c.relname LIKE '$_%'
ESCAPE '$' LOOP
EXECUTE 'GRANT SELECT ON "' || r.nspname || '"."' || r.relname || '" TO username;';
END LOOP;
END;
$$
LANGUAGE plpgsql;