微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在Postgresql中为所有数据库创建具有只读特权的用户?

如何解决如何在Postgresql中为所有数据库创建具有只读特权的用户?

| 我想为所有数据库中的所有表创建一个仅具有选择特权的用户。我以为我可以获取数据库列表,并对每个数据库应用以下命令:
GRANT select ON DATABASE dbname to user1;
但是我收到以下错误
ERROR:  invalid privilege type SELECT for database
当我用google搜索时,建议人们对所有表执行
grant select
操作。但是总是会添加新表。所以这对我来说不是一个可以接受的解决方案。有人知道任何解决方法吗?     

解决方法

        您不能在数据库级别上执行此操作,只能在架构级别上执行此操作。 假设您在每个数据库中仅使用“ 3”模式,则可以执行以下操作:
GRANT SELECT ON ALL TABLES IN SCHEMA public TO user1;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO user;
    ,        您需要做两件事:首先,允许访问现有对象;其次,设置从现在开始创建的新对象的默认访问权限。 请注意,授予对\“ TABLES \”的访问权限包括视图,但不包括序列(例如\“ SERIAL \”列的自动递增功能),因此您可能还希望对这些视图授予访问权限。 下面假设您要在
public
模式中进行所有操作。通过省略
IN SCHEMA ...
子句,
ALTER DEFAULT PRIVILEGES
语句可以作用于整个数据库; schema8必须为每个模式运行一次。
-- Grant access to current tables and views
GRANT SELECT ON ALL TABLES IN SCHEMA public TO user1;
-- Now make sure that\'s also available on new tables and views by default
ALTER DEFAULT PRIVILEGES
    IN SCHEMA public -- omit this line to make a default across all schemas
    GRANT SELECT
ON TABLES 
TO user1;

-- Now do the same for sequences
GRANT SELECT,USAGE ON ALL SEQUENCES IN SCHEMA public TO user1;
ALTER DEFAULT PRIVILEGES
    IN SCHEMA public -- omit this line to make a default across all schemas
    GRANT SELECT,USAGE
ON SEQUENCES 
TO user1;
PostgreSQL手册 http://www.postgresql.org/docs/current/interactive/sql-grant.html http://www.postgresql.org/docs/current/interactive/sql-alterdefaultprivileges.html     ,        我知道您已经说过这不是一个可以接受的答案,但是无论如何这是正确的答案。 指定安全性(GRANT和REVOKE)是表设计和测试的一部分。 在对表定义,安全性,测试和测试数据进行版本控制之前,请勿将表移至生产环境。 话虽这么说,PostgreSQL对数据库没有任何选择权限。您只能授予对数据库的CREATE,CONNECT或TEMP权限。 您可以在给定架构中的所有表上授予SELECT权限。我不知道这对运行GRANT语句后创建的表有何影响,但是测试起来相当容易。 PostgreSQL Grant语法     ,        对于低于9.0的Postgres版本:
psql -d DBNAME -qAt -c \"SELECT \'GRANT SELECT ON \' || tablename || \' TO USER;\' 
FROM pg_tables WHERE schemaname = \'public\'\" | psql -d DBNAME

psql -d DBNAME -qAt -c \"SELECT \'GRANT SELECT ON \' || viewname || \' TO USER;\' 
FROM pg_views WHERE schemaname = \'public\'\" | psql -d DBNAME

psql -d DBNAME -qAt -c \"SELECT \'GRANT SELECT ON \' || relname || \' TO USER;\' 
FROM pg_statio_all_sequences WHERE schemaname = \'public\'\" | psql -d DBNAME
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。