如何使用 psql postgres 使用通配符在 table 上授予 SELECT 特权

How to GRANT SELECT PRIVILEGES on table with wild card with psql postgres

我有一些表的名称以下划线“_XXXXXXX”开头。我需要创建一个只能对这些“_XXXX”表进行查询的用户(仅此而已)没有 viewing/finding其他表的可能性(不是以“_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 块循环所有 table 名称以下划线开头,为其构建语句并执行语句。

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;