我想创建一个只对所有数据库中的所有表拥有select特权的用户。我想我可以获得一个数据库列表,并对每个数据库应用以下命令:
GRANT select ON DATABASE dbname to user1;
但我得到了以下错误:
ERROR: invalid privilege type SELECT for database
当我在谷歌上搜索时,人们建议对所有的表执行grant select
操作。但是总是在添加新的表。所以这对我来说不是一个可接受的解决方案。有人知道什么变通方法吗?
发布于 2011-06-23 21:05:37
您不能在数据库级别执行此操作,只能在模式级别执行此操作。
假设您只在每个数据库中使用public
模式,您可以这样做:
GRANT SELECT ON ALL TABLES IN SCHEMA public TO user1;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO user;
发布于 2011-06-23 19:40:35
我知道你已经说过这不是一个可接受的答案,但不管怎样,这是正确的答案。
指定安全性(GRANT和REVOKE)是表设计和测试的一部分。
在表定义、安全性、测试和测试数据受到版本控制之前,不要将表转移到生产环境中。
话虽如此,PostgreSQL对数据库没有任何SELECT权限。您只能授予对数据库的CREATE、CONNECT或TEMP权限。
您可以对给定模式中的所有表授予SELECT权限。我不知道这对运行GRANT语句后创建的表有何影响,但它很容易测试。
发布于 2012-10-05 19:50:53
对于低于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
https://stackoverflow.com/questions/6452956
复制相似问题