我创建了一个新的超级用户,以便该用户可以运行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;
答案 0 :(得分:1)
您正在描述用户可以将文件写入运行数据库但不是超级用户的服务器的情况。虽然并非不可能,但它绝对是不正常的。关于我允许谁访问我的数据库服务器,我会非常挑剔。
也就是说,如果是这种情况,我会创建一个函数来加载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;
答案 1 :(得分:0)
COPY
除了写STDOUT
之外的其他选项,只能从STDIN
读取数据库超级用户角色,因为它允许读取或写入任何文件服务器有权访问。
\copy
是一个psql客户端命令,它提供与COPY
相同的功能,但不是服务器端的,因此只能处理本地文件 - 这意味着它会调用COPY
但{{{ 1}} / ... FROM STDIN
,以便服务器上的文件不会被“触摸”。
您无法撤消超级用户的特定权限。我在这篇文章中引用文档:
作为超级用户意味着您不受访问控制的约束。
“超级用户”,可以覆盖数据库中的所有访问限制。超级用户状态很危险,只有在真正需要时才能使用。