Postgresql

更改 PostgreSQL 中的內置預設權限?

  • May 30, 2013

介紹。

當我創建一個數據庫時,

postgres=# CREATE DATABASE test2 OWNER test2;

它是用一個的權限列創建的:

  Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
test2     | test2    | UTF8     | en_US.UTF-8 | en_US.UTF-8 |

現在,重要的是要注意,這與沒有授予任何特權的情況不同。在後一種情況下,該列僅包含{}(順便說一下,在 AFAIR 中也顯示為postgres=# \l空*)*。

  • 空欄位表示 PostgreSQL 使用內置的預設權限。
  • {}意味著實際上沒有對數據庫的特權。

研究。

在我們的例子中,這些內置預設值恰好是:

=Tc/test2  +  test2=CTc/test2

我怎麼知道?我發出:

postgres=# GRANT CONNECT ON DATABASE test2 TO test1;

…這導致:

  Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
test2     | test2    | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =Tc/test2            +
          |          |          |             |             | test2=CTc/test2      +
          |          |          |             |             | test1=c/test2

…這是隱式預設值加上test1=c/test2明確授予的。

問題和問題。

=CTc雖然我對這些預設設置中的授予沒有問題owner,但我不想=Tc授予PUBLIC.

當然,我可以REVOKE ALL [...] FROM PUBLIC在創建之後,但是有沒有辦法讓它自動化?

事後諸葛亮。

真的,為什麼這些預設值不是我想要的預設值?為一個應用程序執行一個 PostgreSQL 伺服器,而不是每個應用程序在伺服器上執行一個數據庫是一種流行的做法,即使它是一個小應用程序?

例如,當它偶然發現一個沒有連接權限的數據庫時,phpPgAdmin 的預設安裝“崩潰”,我不得不稍微修改一下原始碼。儘管有很多錯誤報告,但它至少已經這樣做了六個月(我不記得報告的任何日期,但其中一個說已經過去了六個月)。

開箱即用的 PostgreSQL 目前不支持此功能。也許您應該發送功能請求(或更新檔)。

CONNECT特權PUBLIC看起來有些特別:

\l
template1   | postgres | UTF8     | Hungarian, Hungary | Hungarian, Hungary | postgres=CTc/postgres

也就是說,使用者test(它是PUBLIC唯一的成員)無法連接到template1

postgres=# \c template1 test
Password for user test:
FATAL:  permission denied for database "template1"
DETAIL:  User does not have CONNECT privilege.
Previous connection kept

現在讓我們在此之上創建一個數據庫:

CREATE DATABASE test3 TEMPLATE template1;

並通過測試連接到它:

postgres=# \c test3 test
Password for user test:
You are now connected to database "test3" as user "test".
test3=> \c postgres postgres

只是一點上下文:

postgres=# SELECT version();
                          version
-------------------------------------------------------------
PostgreSQL 9.1.4, compiled by Visual C++ build 1500, 32-bit
(1 row)

考慮到這一點,ALTER DEFAULT PRIVILEGES並且不提供意味著更改數據庫級別的預設值這一事實,我想說沒有辦法自動執行此操作。如果您必須創建大量數據庫,那麼安裝腳本可能會派上用場。

引用自:https://dba.stackexchange.com/questions/43387