为什么访问我的数据库需要Postgres超级用户?

时间:2012-05-31 21:41:46

标签: sql postgresql

我在三个数据库中有一个共同用户mygs_usermydatamodelmygsNewdatabase(更改名称以保护无辜者)。

我'继承'前两个数据库,并创建了第三个(Newdatabase),其安全性必须与原始数据库紧密复制 - 包括使用相同的用户名和角色。

问题是当两个原始数据库没有显式权限时,普通用户mygs_user可以很好地访问它们。第三个(Newdatabase)不允许访问,除非我将普通用户修改为超级用户,这显然不是最佳实践。

当然,我已经尝试将我的NewDB的安全设置设置为原始设置而没有骰子。

以下是两个原始数据库:

mydatamodel

CREATE DATABASE mydatamodel
  WITH OWNER = postgres
       ENCODING = 'UTF8'
       TABLESPACE = datamodel_tablespace
       LC_COLLATE = 'English, United States'
       LC_CTYPE = 'English, United States'
       CONNECTION LIMIT = -1;

mygs

CREATE DATABASE mygs
  WITH OWNER = postgres
       ENCODING = 'UTF8'
       TABLESPACE = mygs_tablespace
       LC_COLLATE = 'English, United States'
       LC_CTYPE = 'English, United States'
       CONNECTION LIMIT = -1;

...这是新数据库:

CREATE DATABASE "NewDatabase"
  WITH OWNER = postgres
       ENCODING = 'UTF8'
       TABLESPACE = pg_default
       LC_COLLATE = 'English, United States'
       LC_CTYPE = 'English, United States'
       CONNECTION LIMIT = -1;
GRANT CONNECT, TEMPORARY ON DATABASE "NewDatabase" TO public;
GRANT ALL ON DATABASE "NewDatabase" TO postgres;
GRANT ALL ON DATABASE "NewDatabase" TO mygs_user;

两个原始表格占用单独的表空间,而新表格空间不占用:

CREATE TABLESPACE mygs_tablespace
  OWNER postgres
  LOCATION 'c:/MYGS_Database/PostgreSQL';



CREATE TABLESPACE datamodel_tablespace
  OWNER postgres
  LOCATION 'c:/MYGS_Database/MyDataModel';

这是commmon用户:

CREATE ROLE mygs_user LOGIN
  SUPERUSER NOINHERIT NOCREATEDB NOCREATEROLE;
GRANT "MYGS" TO mygs_user;

......和共同的角色:

CREATE ROLE "MYGS"
  NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE;

以下是pg_hba.conf文件内容:

# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD
# IPv4 local connections:
host    all         all         127.0.0.1/32            md5

如何在不授予超级用户权限的情况下授予对第三个数据库的公共用户的访问权限?

2 个答案:

答案 0 :(得分:2)

我认为你忘了允许在pg_hba.conf配置文件中连接到这个数据库。

您应该添加类似的内容:

# TYPE  DATABASE        USER            ADDRESS                 METHOD
local   Newdatabase     MYGS                                    md5

答案 1 :(得分:0)

进一步检查后,权限设置为在对象级别授权“MYGS”角色,而在数据库级别没有明确的权限。对于每个对象类型,以下代码解决了该问题:

<强>表格

ALTER TABLE tableNameHere OWNER TO postgres;
GRANT ALL ON TABLE dtm_tableNameHereTO postgres;
GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE tableNameHere TO "MYGS";

<强> ...功能:

ALTER FUNCTION functionNameHere(..) OWNER TO postgres;
GRANT EXECUTE ON FUNCTION functionNameHere(..) TO postgres;
GRANT EXECUTE ON FUNCTION functionNameHere(..) TO "MYGS";

...和序列:

ALTER TABLE sequenceNameHere OWNER TO postgres;
GRANT ALL ON TABLE sequenceNameHere TO postgres;
GRANT SELECT, UPDATE ON TABLE sequenceNameHere TO "MYGS";

虽然,postgres用户不需要解决方案工作。

相关问题