Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
King-JXN opened this issue Jan 24, 2024 · 2 comments
Closed

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

King-JXN opened this issue Jan 24, 2024 · 2 comments

Comments

@King-JXN
Copy link

  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
Copy link
Author

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

image

@digoal
Copy link
Owner

digoal commented Jan 25, 2024

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

@digoal digoal closed this as completed Jan 25, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants