我多年来一直在寻找这个,我在网上尝试了一切都没有成功。
我能够在MSSQL中完成它,但我没有找到在PostgreSQL中实现它的方法。
我想要实现的只是创建一个无法创建,删除或更改数据库,函数,表或任何其他内容的登录角色。只需选择特定功能即可。
例如,如果我有一个名为costumer的表和两个名为return_customers()
和return_time()
的函数,我只想要一个能够选择return_customers()
和{{1}的登录角色}。没有比这更好的了。
非常感谢您支持这个有用的网站!
答案 0 :(得分:9)
执行此连接到您要配置的数据库。
-- 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