我的应用程序是多租户的。我正在为每个租户/用户创建一个数据库。到目前为止,我正在使用c#代码中的以下命令创建所有数据库。
CREATE DATABASE @userDBName WITH OWNER = @dbOwner ENCODING = 'UTF8';
这样,我看到所有数据库都有相同的所有者,并且该所有者可以访问所有数据库中的所有表。
现在,根据新的安全性要求,我们要实现的是每个数据库只能由一个用户访问,而一个数据库的用户不能访问另一个数据库。
因为,我是第一次处理Postgres中角色/用户的概念,所以到目前为止我所做的一切都找不到运气。
我创建了用户,并尝试授予他们对单个数据库的访问权限
CREATE USER test WITH ENCRYPTED PASSWORD '123456';
GRANT ALL PRIVILEGES ON DATABASE userdb1 TO test;
现在,当在c#中的连接字符串中,如上所述给用户ID ='test'和Password时,出现权限被拒绝错误。
另外,从PgAdmin中,当我进入数据库并尝试将所有者更改为我在上面创建的新用户时,会出现此错误
ERROR: must be member of role test
究竟需要做什么?我已经研究了Internet上所有可能的解决方案,并尝试了几乎所有方法,但是没有什么帮助很大。
答案 0 :(得分:1)
那很简单。
以超级用户身份连接到数据库,然后运行(假设newowner
是应该拥有数据库的角色):
REASSIGN OWNED BY oldowner TO newowner;
REVOKE CONNECT, TEMPORARY ON DATABASE mydb FROM PUBLIC;
您收到的错误是因为您不是超级用户。
答案 1 :(得分:0)
虽然与您有关如何创建新数据库的问题没有直接关系。您可能需要重新考虑每个客户使用一个数据库的方法,当您扩展到成千上万的租户时,可能会出现一些问题-https://www.citusdata.com/blog/2018/06/28/scaling-from-one-to-one-hundred-thousand-tenants/