我有一个应用程序,可以自动创建 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) 我正在针对为用户提供数据库的应用程序构建集成测试。为其创建的用户不是超级用户,并且无权访问 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)