我创建了一个新的超级用户,以便这个用户可以运行copy命令。
请注意,非超级用户无法运行复制命令。
由于备份应用程序的原因,我需要此用户,并且该应用程序需要运行copy命令
但我指定的所有限制都不起作用(见下文)。
用户postgres和超级用户有什么区别?
有没有更好的方法来实现我想要的?我调查了一个安全定义为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;
最佳答案
您描述的情况是,用户可以将文件写入运行数据库但不是超级用户的服务器。虽然不是不可能,但绝对是不正常的。我会非常挑剔我允许谁访问我的数据库服务器。
也就是说,如果是这种情况,我将创建一个函数来加载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/