小编as.*_*ieu的帖子

postgres 创建可以选择表和这些表的列的有限用户

我有一个应用程序,可以自动创建 PostgreSQL 数据库,还可以自动创建数据库用户。出于安全目的,该数据库用户被授予有限的访问权限,因为它将被移交给客户端使用。 我使用的版本是Postgres 9.6

CREATE USER %USERSETUP% WITH
    LOGIN PASSWORD '%USERSETUPPASS%'
    NOSUPERUSER
    NOCREATEDB
    NOCREATEROLE
    INHERIT
    NOREPLICATION
    CONNECTION LIMIT -1;

ALTER DEFAULT PRIVILEGES IN SCHEMA %SCHEMA% GRANT INSERT, SELECT, UPDATE, DELETE, REFERENCES ON TABLES TO %USERSETUP%;
Run Code Online (Sandbox Code Playgroud)

现在,我的测试还进入创建的数据库,并验证它是否已正确创建,使用查询脚本获取表名称,然后获取每个表内的列名称(作为奖励,还获取列数据类型

由于这些权限,用户无法使用 information_schema。 另外,我只请求带有 SYSTEM CATALOG 的查询脚本

我的表名脚本有效:

SELECT tablename FROM pg_catalog.pg_tables where schemaname = '{schema}'
Run Code Online (Sandbox Code Playgroud)

这将表名称作为列表返回:

业务、位置、人员、客户等...

但是,当我运行以下两个脚本来获取列名称时,我得到的返回值为 0,就好像该用户正在尝试查询 information_schema 一样。我猜这是因为特权:

SELECT c.oid,
  n.nspname,
  c.relname
FROM pg_catalog.pg_class c
     LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relname ~ 'schemaaryzdhyqoi'
  AND …
Run Code Online (Sandbox Code Playgroud)

postgresql permissions scripting users postgresql-9.6

7
推荐指数
1
解决办法
6136
查看次数

postgres 系统目录从表中查询列

我正在针对为用户提供数据库的应用程序构建集成测试。为其创建的用户不是超级用户,并且无权访问 schema_information.tables,因为当我尝试以下脚本时:

SELECT table_name
FROM information_schema.tables
WHERE table_schema='{schema}'
Run Code Online (Sandbox Code Playgroud)

我得到 0 的回报,因为该用户没有权限,我应该这样做。

我正在尝试查询数据库以验证创建的表和列。我可以使用以下脚本通过系统目录获取表名列表:

SELECT tablename
FROM pg_catalog.pg_tables
WHERE schemaname = '{schema}'
Run Code Online (Sandbox Code Playgroud)

这会按照我想要的方式输出表名:

业务、位置、人员等...

我找不到带有系统目录的脚本,然后才能找到每个表的列名(作为奖励,数据类型)。到目前为止,我已经尝试了以下方法:

SELECT attname, format_type(atttypid, atttypmod) AS type
FROM pg_attribute
WHERE  attrelid = 'business'
Run Code Online (Sandbox Code Playgroud)

这是错误:

ERROR:  invalid input syntax for type oid: "business"
LINE 1: ...od) AS type FROM   pg_attribute WHERE  attrelid = 'business'
                                                         ^```
Run Code Online (Sandbox Code Playgroud)

还试过:

SELECT
    a.attname as "Column",
    pg_catalog.format_type(a.atttypid, a.atttypmod) as "Datatype"
FROM
    pg_catalog.pg_attribute a
WHERE
    a.attnum > 0
    AND NOT a.attisdropped
    AND …
Run Code Online (Sandbox Code Playgroud)

postgresql information-schema catalogs system-tables

5
推荐指数
1
解决办法
1万
查看次数