在Google的SQL Cloud Postgres服务中,当我通过Web控制台为PostgreSQL实例创建数据库时,它会自动将数据库的默认“公共”架构的所有者设置为cloudsqladmin。我似乎无法改变所有权:
mydb=> \dn
List of schemas
Name | Owner
--------+---------------
public | cloudsqladmin
(1 row)
mydb=> alter schema public owner to postgres;
ERROR: must be owner of schema public
mydb=> \du
List of roles
Role name | Attributes | Member of
-------------------+------------------------------------------------+---------------------
cloudsqladmin | Superuser, Create role, Create DB, Replication | {}
cloudsqlagent | Create role, Create DB | {cloudsqlsuperuser}
cloudsqlreplica | Replication | {}
cloudsqlsuperuser | Create role, Create DB | {}
pg_signal_backend | Cannot login | {}
postgres | Create role, Create DB | {cloudsqlsuperuser}
mynewuser | Create role, Create DB | {cloudsqlsuperuser}
我还通过Web控制台创建了一个“mynewuser”,并且无法从“cloudsqlsuperuser”组中删除“mynewuser”:
mydb=> alter group cloudsqlsuperuser drop user mynewuser;
ERROR: "cloudsqlsuperuser" can't be altered
如果我想创建一个只有新用户可以访问(并拥有)的公共架构的数据库,我应该在Google web ui之外这样做吗?我创建的任何数据库似乎都由cloudsqladmin拥有,我创建的任何用户都是那些“cloudsqlsuperuser”成员。如果我想限制用户的权限,我应该通过psql正常创建该用户并完全绕过web ui吗?
答案 0 :(得分:0)
根据我的经验,您似乎必须完全绕过web ui / cli工具。 通过cli工具创建数据库时:
gcloud sql databases create DBNAME --instance INSTANCE
它将所有权分配给cloudsqlsuperuser,就像通过gui发出的声音一样。
当我专门通过CLI工具创建用户时:
gcloud sql users create USER 'host' --instance INSTANCE
这些用户获得与cloudsqlsuperuser相同的权限。在这种情况下,可以更改数据库的所有权。我通过psql命令成功连接作为我想拥有数据库并运行的用户:
ALTER DATABASE database OWNER TO user;
但是,如果用户是通过psql(而不是glcoud cli)创建的,那么权限就不一样了,上面的内容也失败了。
我很想创建你的实例,通过工具设置'postgres'用户密码,然后从那里psql到实例,并通过sql命令做你需要的一切。我认为该工具可以很好地完成某些操作(就像用户界面一样),但以后会很痛苦。
如果有人知道更好,我很想听听你如何使用默认的gcloud用户。
答案 1 :(得分:0)
基本上,这里发生的是,通常的CREATE DATABASE
语句似乎基于template0数据库创建了一个新数据库。该数据库由cloudsqladmin拥有。只有Google有权访问的角色。使用gcloud或Web GUI时,它将执行以下查询:
CREATE DATABASE mydb TEMPLATE template1;
对于template1,所有者设置为cloudsqlsuperuser
,该角色已分配给postgres用户以及通过GUI创建的其他用户。
因此,如果您想使用具有适当特权的sql创建数据库,只需执行上面的语句,然后您的公共模式将由cloudsqlsuperuser拥有,并且可以使用默认的postgres用户或其他用户进行更改通过Web GUI创建。
答案 2 :(得分:0)
所有者用户连接到数据库mydb
(例如mynewuser
)。
如果要更改公共架构所有者,首先应将用户postgres
设为数据库mydb
的所有者:
mydb=> ALTER DATABASE mydb OWNER TO postgres;
之后,您可以更改公共架构所有者:
mydb=> ALTER SCHEMA public OWNER TO postgres;
此外,要从mynewuser
组(角色)中删除cloudsqlsuperuser
,请使用:
mydb=> REVOKE cloudsqlsuperuser FROM mynewuser;
注意::Google Cloud Platform(GCP)Cloud SQL(PostgreSQL)中的默认postgres
用户不是实例的superuser
。另外,默认情况下,从GCP Web UI创建的所有用户均具有cloudsqlsuperuser
角色,并具有以下属性(特权):CREATEROLE
,CREATEDB
和LOGIN
。它们没有SUPERUSER
或REPLICATION
属性。