多年来我一直在寻找这个,但我已经尝试了网络上的所有方法,但都没有成功。
我可以在 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
否则该用户仍然无法执行它们,因为函数的内容将在该用户的权限下执行,而不是创建该函数的用户。
参见:
-
CREATE FUNCTION
特别是SECURITY DEFINER
-
GRANT
既用于将用户添加到角色,也用于分配对表、序列等的访问权限 -
REVOKE
-
CREATE ROLE
关于postgresql - 使用登录名(用户)创建 PostgreSQL 9 角色只是为了执行功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12712235/