Postgresql
更改 PostgreSQL 中的內置預設權限?
介紹。
當我創建一個數據庫時,
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
並且不提供意味著更改數據庫級別的預設值這一事實,我想說沒有辦法自動執行此操作。如果您必須創建大量數據庫,那麼安裝腳本可能會派上用場。