我在三个数据库中有一个共同用户mygs_user
:mydatamodel
,mygs
和Newdatabase
(更改名称以保护无辜者)。
我'继承'前两个数据库,并创建了第三个(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
如何在不授予超级用户权限的情况下授予对第三个数据库的公共用户的访问权限?
答案 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用户不需要解决方案工作。