我已经在Power Bi侧论坛上发布了一个类似的问题,但在Power Bi侧上搜索解决方案可能太短视了.

我们有一个postgres模式和一个postgres用户,该用户具有以下权限:被授予连接到数据库和模式的权限、被撤销的CREATE ON SCHEMA权限、被授予对模式中所有表的SELECT权限.仅此而已.用户在数据库客户端中工作,只能从模式中的表中读取,不能创建、插入、读取、更新、删除任何内容.

当我们使用只读用户在Power Bi中导入模式时,表之间的关系不会显示.Postgres文档编写了以下内容:

"视图TABLE_CONSTRAINTS包含属于当前用户拥有或具有SELECT ON以外的某些权限的表的所有约束."

这意味着,我们的只读用户必须授予INSERT、DELETE或UPDATE权限,才能使Power Bi能够显示表关系?!我们的Postgres数据库将作为数据仓库工作,并允许客户从他们当地的Power BiDesktop或他们的公司Power Bi实例进行连接,所以我们对Power Bi端没有太大的影响.

我们是否可以向只读用户授予权限,使其保持只读状态,但允许解析Power Bi中的表关系?

谢谢并致以亲切的问候!

我们try 向用户授予对所有表的INSERT特权,这使得Power Bi解析表关系,但与我们的只读行为冲突. 我们阅读了文档,并试图找出是否存在上述之外的其他可能性.

推荐答案

这确实令人遗憾,但SQL标准明确要求(例如,在ISO/IEC 9075-11:2003,5.58中):

5.58 TABLE_Constraints视图

功能

标识在此目录中可由给定用户或角色访问的表上定义的表约束.

定义

CREATE VIEW TABLE_CONSTRAINTS AS
    SELECT CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, CONSTRAINT_NAME,
           TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME,
           CONSTRAINT_TYPE, IS_DEFERRABLE, INITIALLY_DEFERRED
    FROM DEFINITION_SCHEMA.TABLE_CONSTRAINTS
    WHERE ( TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME ) IN
            ( SELECT TP.TABLE_CATALOG, TP.TABLE_SCHEMA, TP.TABLE_NAME
              FROM DEFINITION_SCHEMA.TABLE_PRIVILEGES AS TP
              WHERE TP.PRIVILEGE_TYPE <> 'SELECT'
[...]

因此,这确实是Power BI的一个缺点,如果它应该与只读用户一起工作的话.另一方面,如果他们想成为数据库不可知的人,他们别无 Select ,只能使用information_schema.

尽管这可能很有趣,但您正在寻找解决方案或变通办法.如果查看视图定义information_schema.table_constraints,您将看到可见性由以下条件确定:

pg_has_role(r.relowner, 'USAGE'::text) OR
has_table_privilege(r.oid, 'INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER'::text) OR
has_any_column_privilege(r.oid, 'INSERT, UPDATE, REFERENCES'::text)

我认为这里最有希望的特权是REFERENCES,它允许用户创建一个指向该表的外键.如果用户在任何模式上都没有CREATE特权,他们就不能创建引用该表的表,因此该特权实际上毫无用处.尽管如此,如果您授予用户对所有表的REFERENCES,则约束将变为可见.这是老生常谈,但应该足够好了.

Postgresql相关问答推荐

Postgs密码重置问题

mosquito-go-auth with postgres authorization error

复合索引列的顺序导致不同的计划

在插入时创建一个触发器,在PostgreSQL中的另一个表上创建另一个触发器

即使存在 GIN 索引,整理默认的类似查询也无法执行

Postgres 生成的列不是不可变的

如何在 MockDataProvider 中创建自定义 JOOQ 记录?

PostgreSQL TIMESTAMPTZ 不适用于 SpringBoot Java Query

使用间隔参数的 go postgres 准备好的语句不起作用

如何在 PSQL 中查找从另一个表继承的子表

PostgreSQL 输入结束时的语法错误

如何为 JavaEE 应用程序中的 PostgreSQL 热备设置配置连接故障转移?

Nodejs应用程序的node-postgres vs pg-promise

PostgreSQL 在 mySQL 中的 date_trunc

Postgres 图像未创建数据库

是否可以在 Postgres 中存储一个 1 字节的数字?

在 PostgreSQL 中表示Sparse稀疏数据

SQL:多次重复结果行,并对行进行编号

使用 PostgreSQL 创建数据透视表

如何使用 Django Migrations 重新创建已删除的表?