如何更改通过Google控制台创建的数据库中公共架构的所有者?

时间:2017-05-26 19:42:27

标签: postgresql google-cloud-platform google-cloud-sql

在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吗?

3 个答案:

答案 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角色,并具有以下属性(特权):CREATEROLECREATEDBLOGIN。它们没有SUPERUSERREPLICATION属性。