如何使用psql postgres使用通配符授予表上的选择特权

时间:2018-12-28 18:34:24

标签: postgresql psql

在其他表格中,我有以下划线“ _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',所有用户仍然具有相同的访问权限)。我确定是我自己不了解事情的运作方式

enter image description here

我的数据库结构如下:

enter image description here

1 个答案:

答案 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;