postgresql - 使用登录名(用户)创建 PostgreSQL 9 角色只是为了执行功能

标签 postgresql

多年来我一直在寻找这个,但我已经尝试了网络上的所有方法,但都没有成功。

我可以在 MSSQL 中做到这一点,但我没有找到在 PostgreSQL 中做到这一点的方法。

我想要实现的只是创建一个不能创建、删除或更改数据库、函数、表或任何其他内容的登录角色。只需选择特定功能即可。

例如,如果我有一个名为 costumer 的表和两个名为 return_customers()return_time() 的函数,我只想要一个可以选择的登录角色return_customers()select return_time()。仅此而已。

非常感谢您支持这个有用的网站!

最佳答案

执行此连接到您要配置的数据库。

-- Create the user.
CREATE ROLE somebody WITH LOGIN PASSWORD '...';

-- Prevent all authenticated users from being able to use the database,
-- unless they have been explicitly granted permission.
REVOKE ALL PRIVILEGES ON DATABASE foo FROM PUBLIC;
REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM PUBLIC;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public FROM PUBLIC;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM PUBLIC;

-- Allow the user to only use the specified functions.
GRANT CONNECT ON DATABASE foo TO somebody;
GRANT EXECUTE ON FUNCTION return_customers(), return_time() TO somebody;

如果您有比“public”更多的模式,那么您需要将它们添加到两个 REVOKE ALL PRIVILEGES ON ALL ... 语句中。

不要忘记函数必须是 created with SECURITY DEFINER否则该用户仍然无法执行它们,因为函数的内容将在该用户的权限下执行,而不是创建该函数的用户。

参见:

关于postgresql - 使用登录名(用户)创建 PostgreSQL 9 角色只是为了执行功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12712235/

相关文章:

sql - 使用间距阈值对可变连续的带时间戳的记录进行分组

php - postgresql 选择查询不工作

postgresql - 如何将plpgsql中的查询错误保存到表中?

postgresql - ODBC/JDBC 代理到 Postgresql

postgresql - 在 Rails 3.1 中使用 .where IN 子句和 .includes 向下和向上许多嵌套级别来查找一组 ID

postgresql - 异常中的 SQLAlchemy Unicode 问题

json - 将查询结果转换为 hstore 时保留列名

python - 有没有办法在 Redshift 中使用 CONCAT(table_name(col1, col2, col3,.....)) 连接可变数量的列?

sql - 间接 UNIQUE 约束

sql - 如何从sql表中获取子字符串?