我创建了一个新的 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/