database - 用户 postgres 和 super 用户有什么区别?

标签 database postgresql role

我创建了一个新的 super 用户,以便该用户可以运行 COPY 命令。 请注意,非 super 用户无法运行复制命令。 由于备份应用程序,我需要此用户,并且该应用程序需要运行 COPY 命令

但是我指定的所有限制都没有生效(见下文)。 用户 postgres 和 super 用户有什么区别?

有没有更好的方法来实现我想要的?我研究了一个带有安全定义器的函数作为 postgres ...对于多个表来说似乎有很多工作。

DROP ROLE IF EXISTS mynewuser;
CREATE ROLE mynewuser PASSWORD 'somepassword' SUPERUSER NOCREATEDB NOCREATEROLE NOINHERIT LOGIN;
-- ISSUE: the user can still CREATEDB, CREATEROLE

REVOKE UPDATE,DELETE,TRUNCATE ON ALL TABLES IN SCHEMA public, schema1, schema2, schema3 FROM mynewuser;
-- ISSUE: the user can still UPDATE, DELETE, TRUNCATE

REVOKE CREATE ON DATABASE ip2_sync_master FROM mynewuser;
-- ISSUE: the user can still create table;

最佳答案

您描述的情况是,用户可以将文件写入运行数据库但不是 super 用户的服务器。虽然不是不可能,但绝对是不正常的。我会非常有选择性地允许谁访问我的数据库服务器。

就是说,如果是这种情况,我会创建一个函数来加载表(使用 copy),该表由 postgres 用户拥有并授予该用户执行功能的权利。您可以将文件名作为参数传递。

如果你想花点心思,你可以创建一个用户表和表来定义用户可以上传到哪些表,并将表名也作为参数。

这很不符合常理,但这是一个想法。

这是一个基本的例子:

CREATE OR REPLACE FUNCTION load_table(TABLENAME text, FILENAME text)
  RETURNS character varying AS
$BODY$
DECLARE
  can_upload integer;
BEGIN

  select count (*)
  into can_upload
  from upload_permissions p
  where p.user_name = current_user and p.table_name = TABLENAME;

  if can_upload = 0 then
    return 'Permission denied';
  end if;

  execute 'copy ' || TABLENAME ||
    ' from ''' || FILENAME || '''' ||
    ' csv';

  return '';
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

关于database - 用户 postgres 和 super 用户有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38905842/

相关文章:

sql - 为什么查询的数据以结果集的形式返回,而不是以数组的形式返回?

database - JPA问题(Scala使用)

authentication - WSO2 中服务提供者的基于角色的 OAuth2 身份验证

permissions - JasperServer角色问题

sql - PG 功能故障排除

sql - URL 的最佳数据库字段类型

linux - 在 CSV 中用 sed 替换空格(使用 w/postgres 复制命令)

php - 使用 PHP 在 POSTGRESQL 数据库中上传/下载文件

postgresql - 如何在 Debian 的 Postgres 10 中使用 scram-sha-256?获取 "FATAL: password authentication failed"

accessibility - 网站可以采取哪些简单步骤来改善残障访问者的可访问性?