在其他表中,我有一些表的名称以下划线“_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”仍然具有相同的访问权限)。我确定是我不了解事情是如何运作的
我的数据库结构如下:
最佳答案
您可以使用 DO
block 循环遍历名称以下划线开头的所有表,为其构建语句并执行该语句。
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;
关于postgresql - 如何使用 psql postgres 在带有通配符的表上授予 SELECT PRIVILEGES,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53962906/