Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 如何在通过Google控制台创建的数据库中更改公共模式的所有者?_Postgresql_Google Cloud Platform_Google Cloud Sql - Fatal编程技术网

Postgresql 如何在通过Google控制台创建的数据库中更改公共模式的所有者?

Postgresql 如何在通过Google控制台创建的数据库中更改公共模式的所有者?,postgresql,google-cloud-platform,google-cloud-sql,Postgresql,Google Cloud Platform,Google Cloud Sql,在Google的SQL Cloud Postgres服务中,当我通过Web控制台为PostgreSQL实例创建数据库时,它会自动将数据库默认“public”模式的所有者设置为cloudsqladmin。似乎我无法改变所有权: mydb=> \dn List of schemas Name | Owner --------+--------------- public | cloudsqladmin (1 row) mydb=> alter schema pu

在Google的SQL Cloud Postgres服务中,当我通过Web控制台为PostgreSQL实例创建数据库时,它会自动将数据库默认“public”模式的所有者设置为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”:


如果我想创建一个只有新用户才有权访问(并拥有)的公共模式的数据库,我应该在GoogleWebUI之外这样做吗?似乎我创建的任何数据库都属于cloudsqladmin,我创建的任何用户都是“cloudsqlsuperuser”成员。如果我想限制某个用户的权限,我是否应该正常地通过psql创建该用户并完全绕过web ui?

根据我的经验,您似乎必须完全绕过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命令执行您需要的所有操作。我认为该工具在某些方面做得非常好(UI也是如此),但在以后会很痛苦


如果有人知道得更清楚,我很想听听您如何使用默认的gcloud用户。

这里发生的基本情况是,通常的
CREATE DATABASE
语句似乎在template0数据库的基础上创建了一个新的数据库。此数据库由cloudsqladmin拥有。只有谷歌才能访问的角色。使用gcloud或web GUI时,它会执行以下查询:

CREATE DATABASE mydb TEMPLATE template1;
对于template1,所有者设置为
cloudsqlsuperuser
一个角色,分配给postgres用户和通过GUI创建的其他用户


因此,如果您希望使用具有适当权限的sql创建数据库,只需执行上面的语句,您的公共模式将由cloudsqlsuperuser拥有,并且可以使用默认的postgres用户或通过web GUI创建的其他用户进行更改

通过所有者用户连接数据库
mydb
(例如,它是
mynewuser
)。 如果要更改公共架构所有者,首先应使用户成为数据库的所有者
mydb

mydb=> ALTER DATABASE mydb OWNER TO postgres;
之后,您可以更改公共架构所有者:

mydb=> ALTER SCHEMA public OWNER TO postgres;
此外,要从
cloudsqlsuperuser
组(角色)中删除您的
mynewuser
,请使用:

注意:谷歌云平台(GCP)云SQL(PostgreSQL)中的默认
postgres
用户不是实例的
超级用户。此外,默认情况下,从GCP web UI创建的所有用户都具有
cloudsqlsuperuser
角色和以下属性(权限):
CREATEROLE
CREATEDB
登录。它们没有
超级用户
复制
属性

mydb=> ALTER SCHEMA public OWNER TO postgres;
mydb=> REVOKE cloudsqlsuperuser FROM mynewuser;