digoal / blog

Opensource,Database,AI,Business,Minds. git clone --depth 1 https://github.com/digoal/blog
https://github.com/digoal/blog/blob/master/README.md
GNU General Public License v2.0
8.09k stars 1.89k forks source link

德哥,咨询一个权限问题,涉及到不同模式和视图 #124

Closed King-JXN closed 9 months ago

King-JXN commented 9 months ago
  1. 数据库A中有两个模式,一个是默认的public模式,一个是新建的模式userviews;
  2. public 模式中有一张表indicator_views,其中一个字段表示创建视图的SQL语句;
  3. indicator_views数据表上有一个触发器,从新增记录中提取视图定义语句,然后调用EXECUTE语句在userviews模式创建视图,对应的存储过程如下: ` CREATE OR REPLACE FUNCTION public.create_indicator_view() RETURNS trigger LANGUAGE plpgsql AS $function$ DECLARE view_name TEXT; is_exist BOOL; BEGIN view_name := format('%s', NEW.name);

    SELECT EXISTS (SELECT * FROM pg_catalog.pg_views WHERE schemaname = 'userviews' AND viewname = view_name) INTO is_exist;
    IF NOT is_exist THEN
        EXECUTE format(NEW.definition);
    END IF;
    RETURN NULL;

    END $function$ `

  4. 在userviews模式下为example用户服务访问视图的权限 ALTER DEFAULT PRIVILEGES IN SCHEMA userviews GRANT SELECT ON TABLES TO example; GRANT USAGE ON SCHEMA userviews TO example; GRANT SELECT ON ALL TABLES IN SCHEMA userviews TO example;
  5. 现在的问题是,系统往indicator_views写入一条记录后,example用户没有访问userviews模式下的新创建视图的权限,请教一下有没有解决思路。
King-JXN commented 9 months ago

创建视图的存储过程,上面的代码太乱了。。。

image

digoal commented 9 months ago

可能没有view的default权限赋予功能, 我看你用的是table, 然而你需要view的权限. 解决办法: 可以把赋予view权限的语句放到触发器内. 加一个赋予权限的语句