1

、、、および(無実を保護するために名前が変更された)のmygs_user3つのデータベースに mydatamodel共通のユーザーがあります。mygsNewdatabase

私は最初の2つのデータベースを「継承」し、3番目のデータベース(Newdatabase)を作成しました。そのセキュリティは、同じユーザー名とロールを使用するなど、元の2つのデータベースを厳密に複製する必要があります。

問題は、2つの元のデータベースに明示的な特権がない場合でも、共通ユーザーでmygs_userあるがそれらに問題なくアクセスできることです。3番目の(Newdatabase)は、一般ユーザーをスーパーユーザーに変更しない限りアクセスを許可しません。これは明らかにベストプラクティスではありません。

もちろん、NewDBのセキュリティ設定をサイコロのない元の設定に設定してみました。

2つの元のデータベースは次のとおりです。

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;

元の2つは別々のテーブルスペースを占有しますが、新しいテーブルスペースは占有しません。

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



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

これは一般的なユーザーです:

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

スーパーユーザー権限を付与せずに、3番目のデータベースの共通ユーザーへのアクセスを許可するにはどうすればよいですか?

4

2 に答える 2

2

pg_hba.conf構成ファイルでこのデータベースへの接続を許可するのを忘れたと思います。

おそらくそこに次のようなものを追加する必要があります。

# TYPE  DATABASE        USER            ADDRESS                 METHOD
local   Newdatabase     MYGS                                    md5
于 2012-05-31T21:49:55.863 に答える
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ユーザーは必要ありません。

于 2012-06-01T15:00:37.867 に答える